├── cli └── Xams.Cli │ ├── build.sh │ ├── CreateNextJs.cs │ ├── LICENSE.txt │ ├── README.md │ ├── Xams.Cli.csproj │ └── CreateApi.cs ├── core ├── xams-workspace │ ├── ixeta-xams │ │ ├── stats.json │ │ ├── README.md │ │ ├── index.ts │ │ ├── src │ │ │ ├── input.css │ │ │ ├── api │ │ │ │ ├── UIInfo.tsx │ │ │ │ ├── ActionRequest.tsx │ │ │ │ ├── TablesResponse.tsx │ │ │ │ ├── Request.tsx │ │ │ │ ├── Permission.tsx │ │ │ │ ├── ApiResponse.tsx │ │ │ │ ├── BulkRequest.tsx │ │ │ │ ├── RolePermission.tsx │ │ │ │ ├── AuditField.tsx │ │ │ │ ├── ReadResponse.tsx │ │ │ │ └── ReadRequest.tsx │ │ │ ├── hooks │ │ │ │ ├── useGuid.tsx │ │ │ │ └── useColor.tsx │ │ │ ├── components │ │ │ │ ├── datatable │ │ │ │ │ └── DataTableContext.tsx │ │ │ │ └── datagrid │ │ │ │ │ ├── SubGridContext.tsx │ │ │ │ │ └── DataGridCellError.tsx │ │ │ ├── utils │ │ │ │ └── PermissionUtil.tsx │ │ │ ├── apiurls.tsx │ │ │ ├── admin │ │ │ │ ├── types │ │ │ │ │ └── RolePermissionTypes.ts │ │ │ │ ├── nav │ │ │ │ │ └── AdminDashLogs.tsx │ │ │ │ └── components │ │ │ │ │ ├── CopyId.tsx │ │ │ │ │ └── TypescriptTypes.tsx │ │ │ ├── getQueryParam.tsx │ │ │ └── contexts │ │ │ │ └── FormContext.tsx │ │ ├── postcss.config.js │ │ ├── tailwind.config.ts │ │ └── tsconfig.json │ ├── ixeta-xams-lite │ │ ├── stats.json │ │ ├── README.md │ │ ├── index.ts │ │ ├── postcss.config.js │ │ ├── src │ │ │ ├── api │ │ │ │ ├── UIInfo.tsx │ │ │ │ ├── ActionRequest.tsx │ │ │ │ ├── TablesResponse.tsx │ │ │ │ ├── Request.tsx │ │ │ │ ├── Permission.tsx │ │ │ │ ├── ApiResponse.tsx │ │ │ │ ├── BulkRequest.tsx │ │ │ │ ├── RolePermission.tsx │ │ │ │ ├── AuditField.tsx │ │ │ │ ├── ReadResponse.tsx │ │ │ │ ├── MetadataResponse.tsx │ │ │ │ └── ReadRequest.tsx │ │ │ ├── apiurls.tsx │ │ │ ├── getQueryParam.tsx │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tsconfig.json │ │ └── rollup.config.js │ ├── headless-auth-react │ │ ├── global.css │ │ ├── stats.json │ │ ├── index.ts │ │ ├── src │ │ │ ├── input.css │ │ │ ├── AuthConfigOptions.ts │ │ │ ├── index.ts │ │ │ └── utils │ │ │ │ └── getDeviceType.ts │ │ ├── postcss.config.js │ │ ├── tailwind.config.ts │ │ ├── styles.css │ │ ├── tsconfig.json │ │ └── rollup.config.js │ ├── ixeta-xams-firebase │ │ ├── global.css │ │ ├── stats.json │ │ ├── index.ts │ │ ├── postcss.config.js │ │ ├── tailwind.config.ts │ │ ├── styles.css │ │ ├── src │ │ │ ├── index.ts │ │ │ └── components │ │ │ │ └── auth │ │ │ │ └── LoginContainer.tsx │ │ ├── tsconfig.json │ │ └── rollup.config.js │ ├── headless-auth-react-firebase │ │ ├── global.css │ │ ├── stats.json │ │ ├── README.md │ │ ├── index.ts │ │ ├── src │ │ │ └── index.ts │ │ ├── postcss.config.js │ │ ├── tailwind.config.ts │ │ ├── styles.css │ │ ├── tsconfig.json │ │ └── rollup.config.js │ ├── headless-auth-react-supabase │ │ ├── global.css │ │ ├── stats.json │ │ ├── README.md │ │ ├── index.ts │ │ ├── postcss.config.js │ │ ├── src │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── styles.css │ │ ├── tsconfig.json │ │ └── rollup.config.js │ ├── admin-dash │ │ ├── .eslintrc.json │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── vercel.svg │ │ ├── postcss.config.js │ │ ├── .env.development │ │ ├── .env.production │ │ ├── .env.test │ │ ├── src │ │ │ ├── types.d.ts │ │ │ ├── pages │ │ │ │ └── _document.tsx │ │ │ ├── styles │ │ │ │ └── globals.css │ │ │ └── utils │ │ │ │ └── verifyEmailUtil.ts │ │ ├── .gitignore │ │ ├── tailwind.config.ts │ │ ├── next.config.js │ │ └── tsconfig.json │ ├── examples-app │ │ ├── .eslintrc.json │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── vercel.svg │ │ ├── postcss.config.js │ │ ├── .env.development │ │ ├── .env.production │ │ ├── .env.test │ │ ├── src │ │ │ ├── pages │ │ │ │ ├── admin.tsx │ │ │ │ ├── test.tsx │ │ │ │ ├── api │ │ │ │ │ └── hello.ts │ │ │ │ └── _document.tsx │ │ │ ├── examples │ │ │ │ ├── DataTableTitle.tsx │ │ │ │ ├── DTFormMaxWidth.tsx │ │ │ │ ├── DataTableMaxResults.tsx │ │ │ │ ├── DataTableFields.tsx │ │ │ │ ├── DTFormZIndex.tsx │ │ │ │ ├── DataTableDisabled.tsx │ │ │ │ ├── DTFormFields.tsx │ │ │ │ ├── DTFormTitle.tsx │ │ │ │ ├── DataTableConfirmDelete.tsx │ │ │ │ ├── DataTableSearchable.tsx │ │ │ │ ├── DTFormHideSaveButton.tsx │ │ │ │ ├── DataTableColumnWidths.tsx │ │ │ │ ├── DataTables.tsx │ │ │ │ ├── DataTableScrollable.tsx │ │ │ │ ├── DataTableOrder.tsx │ │ │ │ ├── DTFormDefaults.tsx │ │ │ │ ├── DataTableCreateButton.tsx │ │ │ │ ├── DataTableConfirmDeleteMessage.tsx │ │ │ │ ├── DataTableFilters.tsx │ │ │ │ ├── DTFormCloseOptions.tsx │ │ │ │ ├── FieldTextarea.tsx │ │ │ │ ├── FieldRichText.tsx │ │ │ │ ├── FieldOnChange.tsx │ │ │ │ ├── FormBuilderData.tsx │ │ │ │ ├── DataTableCUD.tsx │ │ │ │ ├── DataTableTitleCode.tsx │ │ │ │ ├── DTFormMaxWidthCode.tsx │ │ │ │ └── DTFormCustom.tsx │ │ │ └── components │ │ │ │ ├── CodeExample.tsx │ │ │ │ └── Highlighter.tsx │ │ ├── next.config.js │ │ ├── .gitignore │ │ ├── tsconfig.json │ │ └── tailwind.config.ts │ └── package.json └── xams │ ├── MyXProject.Web │ ├── swagger-config.yaml │ ├── appsettings.Development.json │ ├── Config.cs │ ├── dbreset.sh │ ├── appsettings.json │ ├── Migrations │ │ ├── 20240609204023_migration02.cs │ │ ├── 20240609204055_migration03.cs │ │ ├── 20250208022646_migration07.cs │ │ ├── 20241101185430_migration06.cs │ │ └── 20240925115326_migration05.cs │ ├── ConfigData.cs │ ├── dbupdate.sh │ └── Dockerfile │ ├── Xams.Core │ ├── wwwroot │ │ └── xams │ │ │ ├── favicon.ico │ │ │ ├── _next │ │ │ └── static │ │ │ │ ├── AA7PCj7B5eRLraws42ONr │ │ │ │ ├── _ssgManifest.js │ │ │ │ └── _buildManifest.js │ │ │ │ └── chunks │ │ │ │ └── pages │ │ │ │ ├── _error-04e1fb7a67d4f61e.js │ │ │ │ ├── profile-d694ec5a5e9087b4.js │ │ │ │ ├── __ │ │ │ │ └── auth │ │ │ │ │ └── action-db7ccbeab52656af.js │ │ │ │ ├── reset-password-c41c8524f84c6343.js │ │ │ │ └── login-c58f0b4152312724.js │ │ │ └── vercel.svg │ ├── Attributes │ │ ├── CascadeDeleteAttribute.cs │ │ ├── UIProxyAttribute.cs │ │ ├── OwningUserAttribute.cs │ │ ├── UIDescriptionAttribute.cs │ │ ├── ModuleDbContextAttribute.cs │ │ ├── ServicePermissionAttribute.cs │ │ ├── UINameAttribute.cs │ │ ├── UIOptionAttribute.cs │ │ ├── JobTimeZone.cs │ │ ├── ServiceHubAttribute.cs │ │ ├── ServiceSecurityAttribute.cs │ │ ├── UICharacterLimitAttribute.cs │ │ ├── UIOrderAttribute.cs │ │ ├── ServiceActionAttribute.cs │ │ ├── UINumberRangeAttribute.cs │ │ ├── JobInitialStateAttribute.cs │ │ ├── JobServerAttribute.cs │ │ ├── UIRequiredAttribute.cs │ │ ├── UIRecommendedAttribute.cs │ │ ├── BulkServiceAttribute.cs │ │ ├── UIMultiSelect.cs │ │ ├── UIReadOnlyAttribute.cs │ │ ├── UICreateOnlyAttribute.cs │ │ ├── UIHideAttribute.cs │ │ ├── UISetFieldFromLookupAttribute.cs │ │ ├── ServiceStartupAttribute.cs │ │ ├── UIDisplayNameAttribute.cs │ │ ├── UIDateFormatAttribute.cs │ │ └── ServiceLogicAttribute.cs │ ├── Dtos │ │ ├── Data │ │ │ ├── BatchInput.cs │ │ │ ├── FileInput.cs │ │ │ ├── MetadataInput.cs │ │ │ ├── PermissionsInput.cs │ │ │ ├── TablesOutput.cs │ │ │ ├── ActionInput.cs │ │ │ ├── BulkInput.cs │ │ │ ├── Input.cs │ │ │ └── ReadOutput.cs │ │ ├── ApiResponse.cs │ │ └── Response.cs │ ├── Interfaces │ │ ├── IServiceJob.cs │ │ ├── IBulkService.cs │ │ ├── IPipelineStage.cs │ │ ├── IServiceAction.cs │ │ ├── IServiceStartup.cs │ │ ├── IResponse.cs │ │ ├── IServiceLogic.cs │ │ └── IServicePermission.cs │ ├── Utils │ │ ├── StringExtensions.cs │ │ ├── GuidUtil.cs │ │ └── SqlTranslator.cs │ ├── Extensions │ │ └── ExtensionMethods.cs │ ├── Contexts │ │ ├── JobServiceContext.cs │ │ ├── ActionServiceContext.cs │ │ ├── BulkServiceContext.cs │ │ ├── PermissionContext.cs │ │ ├── HubSendContext.cs │ │ └── StartupContext.cs │ ├── README.md │ ├── Entities │ │ ├── Permission.cs │ │ ├── Team.cs │ │ ├── TeamUser.cs │ │ ├── Server.cs │ │ ├── TeamRole.cs │ │ ├── UserRole.cs │ │ ├── RolePermission.cs │ │ ├── Role.cs │ │ ├── Setting.cs │ │ ├── User.cs │ │ ├── System.cs │ │ ├── Option.cs │ │ ├── AuditField.cs │ │ ├── Audit.cs │ │ ├── Job.cs │ │ └── AuditHistoryDetail.cs │ ├── Pipeline │ │ ├── Stages │ │ │ ├── PipeResultEmpty.cs │ │ │ ├── PipeEntityCreate.cs │ │ │ ├── PipeEntityUpdate.cs │ │ │ ├── PipeAddEntityToEntities.cs │ │ │ ├── Shared │ │ │ │ └── PipelineUtil.cs │ │ │ └── PipePreValidation.cs │ │ ├── SystemParameters.cs │ │ └── PipelineBuilder.cs │ ├── Services │ │ ├── Auditing │ │ │ ├── AuditFieldService.cs │ │ │ ├── AuditHistoryDetailService.cs │ │ │ └── AuditCacheRefreshJob.cs │ │ ├── Logic │ │ │ └── SystemService.cs │ │ └── Permission │ │ │ └── CreatePermissions.cs │ ├── Config │ │ └── FirebaseConfig.cs │ ├── Jobs │ │ ├── JobOptions.cs │ │ └── LogStartupService.cs │ ├── Base │ │ ├── BasePipelineStage.cs │ │ └── BaseEntity.cs │ └── LICENSE.txt │ ├── Xams.Console │ └── Xams.Console.csproj │ ├── .dockerignore │ └── Xams.Firebase │ └── Xams.Firebase.csproj ├── xams-mcp-server ├── docs │ └── xams-docs-v1 │ │ ├── .prettierignore │ │ ├── .eslintrc.json │ │ ├── postcss.config.js │ │ ├── src │ │ ├── app │ │ │ ├── favicon.ico │ │ │ ├── react_field │ │ │ │ └── page.mdx │ │ │ ├── claude │ │ │ │ └── page.mdx │ │ │ ├── performance │ │ │ │ └── page.mdx │ │ │ ├── not-found.tsx │ │ │ ├── page.mdx │ │ │ └── providers.tsx │ │ ├── images │ │ │ ├── edit_role.png │ │ │ ├── audit_admin.png │ │ │ ├── audit_config.png │ │ │ ├── audit_history.png │ │ │ ├── firebase_auth.png │ │ │ ├── logging_admin.png │ │ │ ├── widget_form.png │ │ │ ├── widget_table.png │ │ │ ├── attribute_required.png │ │ │ ├── admin_create_option.png │ │ │ ├── audit_field_history.png │ │ │ ├── option_create_widget.png │ │ │ ├── order_create_uiname.png │ │ │ ├── realtime_permissions.png │ │ │ ├── widget_import_export.png │ │ │ ├── widget_table_create.png │ │ │ ├── widget_uirecommended.png │ │ │ ├── xams_security_schema.png │ │ │ ├── attribute_displayname.png │ │ │ ├── attribute_uimultiselect.png │ │ │ ├── audit_history_details.png │ │ │ ├── order_create_uidescription.png │ │ │ ├── diagrams │ │ │ │ └── crud_architecture_diagram.png │ │ │ └── logos │ │ │ │ ├── ruby.svg │ │ │ │ └── python.svg │ │ ├── mdx │ │ │ ├── recma.mjs │ │ │ └── remark.mjs │ │ ├── lib │ │ │ └── remToPx.ts │ │ ├── components │ │ │ ├── icons │ │ │ │ ├── BoltIcon.tsx │ │ │ │ ├── ShirtIcon.tsx │ │ │ │ ├── LinkIcon.tsx │ │ │ │ ├── MagnifyingGlassIcon.tsx │ │ │ │ ├── CheckIcon.tsx │ │ │ │ ├── BookIcon.tsx │ │ │ │ ├── DocumentIcon.tsx │ │ │ │ ├── PaperAirplaneIcon.tsx │ │ │ │ ├── FaceSmileIcon.tsx │ │ │ │ ├── ListIcon.tsx │ │ │ │ ├── PaperClipIcon.tsx │ │ │ │ ├── PackageIcon.tsx │ │ │ │ ├── CopyIcon.tsx │ │ │ │ ├── ChevronRightLeftIcon.tsx │ │ │ │ ├── EnvelopeIcon.tsx │ │ │ │ ├── BellIcon.tsx │ │ │ │ ├── CartIcon.tsx │ │ │ │ ├── ChatBubbleIcon.tsx │ │ │ │ ├── ShapesIcon.tsx │ │ │ │ ├── SquaresPlusIcon.tsx │ │ │ │ ├── ClipboardIcon.tsx │ │ │ │ ├── MapPinIcon.tsx │ │ │ │ ├── CalendarIcon.tsx │ │ │ │ ├── FolderIcon.tsx │ │ │ │ ├── UsersIcon.tsx │ │ │ │ ├── UserIcon.tsx │ │ │ │ └── TagIcon.tsx │ │ │ └── Prose.tsx │ │ └── styles │ │ │ └── tailwind.css │ │ ├── prettier.config.js │ │ ├── mdx-components.tsx │ │ ├── types.d.ts │ │ ├── .gitignore │ │ ├── next.config.mjs │ │ ├── yes.pub │ │ └── tsconfig.json ├── .npmignore ├── .gitignore ├── tsconfig.json ├── src │ └── types.ts └── package.json ├── README.md └── .claude └── settings.local.json /cli/Xams.Cli/build.sh: -------------------------------------------------------------------------------- 1 | dotnet pack -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/stats.json: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/stats.json: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react/global.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react/stats.json: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-firebase/global.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-firebase/stats.json: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/README.md: -------------------------------------------------------------------------------- 1 | ## TODO 2 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/.prettierignore: -------------------------------------------------------------------------------- 1 | ** -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/README.md: -------------------------------------------------------------------------------- 1 | ## TODO 2 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-firebase/global.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-firebase/stats.json: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-supabase/global.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-supabase/stats.json: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./src"; 2 | -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/swagger-config.yaml: -------------------------------------------------------------------------------- 1 | tryItOutEnabled: true -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-firebase/README.md: -------------------------------------------------------------------------------- 1 | ## TODO 2 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-supabase/README.md: -------------------------------------------------------------------------------- 1 | ## TODO 2 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./src"; 2 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./src"; 2 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-firebase/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./src"; 2 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-firebase/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./src"; 2 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-supabase/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./src"; 2 | -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/input.css: -------------------------------------------------------------------------------- 1 | /* @tailwind base; */ 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /xams-mcp-server/.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | tsconfig.json 3 | .git/ 4 | .gitignore 5 | *.log 6 | node_modules/ 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-firebase/src/index.ts: -------------------------------------------------------------------------------- 1 | export { FirebaseAuthConfig } from "./FirebaseAuthConfig"; 2 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react/src/input.css: -------------------------------------------------------------------------------- 1 | /* @tailwind base; */ 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-firebase/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/api/UIInfo.tsx: -------------------------------------------------------------------------------- 1 | export interface UIInfo { 2 | canDelete: boolean; 3 | canUpdate: boolean; 4 | } 5 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/wwwroot/xams/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/core/xams/Xams.Core/wwwroot/xams/favicon.ico -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/api/UIInfo.tsx: -------------------------------------------------------------------------------- 1 | export interface UIInfo { 2 | canDelete: boolean; 3 | canUpdate: boolean; 4 | } 5 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/api/ActionRequest.tsx: -------------------------------------------------------------------------------- 1 | export interface ActionRequest { 2 | name: string; 3 | parameters?: any; 4 | } 5 | -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/core/xams-workspace/admin-dash/public/favicon.ico -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-firebase/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-supabase/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-supabase/src/index.ts: -------------------------------------------------------------------------------- 1 | export { SupabaseAuthConfig as SupabaseAuthConfig } from "./SupabaseAuthConfig"; 2 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/api/ActionRequest.tsx: -------------------------------------------------------------------------------- 1 | export interface ActionRequest { 2 | name: string; 3 | parameters?: any; 4 | } 5 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/core/xams-workspace/examples-app/public/favicon.ico -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/CascadeDeleteAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class CascadeDeleteAttribute : Attribute 4 | { } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UIProxyAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class UIProxyAttribute : Attribute 4 | { 5 | 6 | } -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/OwningUserAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class OwningUserAttribute : Attribute 4 | { 5 | } 6 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/app/favicon.ico -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/.env.development: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_NAME="dev" 2 | NEXT_PUBLIC_API="https://localhost:7102" 3 | SECRET="1d2fe23138b102edcc2d6d93ae2caa06" -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/.env.development: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_NAME="dev" 2 | NEXT_PUBLIC_API="https://localhost:7102" 3 | SECRET="1d2fe23138b102edcc2d6d93ae2caa06" -------------------------------------------------------------------------------- /core/xams/Xams.Core/wwwroot/xams/_next/static/AA7PCj7B5eRLraws42ONr/_ssgManifest.js: -------------------------------------------------------------------------------- 1 | self.__SSG_MANIFEST=new Set,self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB(); -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UIDescriptionAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class UIDescriptionAttribute : Attribute 4 | { 5 | 6 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/edit_role.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/edit_role.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/mdx/recma.mjs: -------------------------------------------------------------------------------- 1 | import { mdxAnnotations } from 'mdx-annotations' 2 | 3 | export const recmaPlugins = [mdxAnnotations.recma] 4 | -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/.env.production: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_NAME="prod" 2 | NEXT_PUBLIC_API="" 3 | NEXTAUTH_URL="https://xxx.com" 4 | SECRET="1d2fe93438b102edcc2d6d93ae2caa06" -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/api/TablesResponse.tsx: -------------------------------------------------------------------------------- 1 | export interface TablesResponse { 2 | tableName: string; 3 | displayName: string; 4 | tag: string; 5 | } 6 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/ModuleDbContextAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class ModuleDbContextAttribute : Attribute 4 | { 5 | 6 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/ServicePermissionAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class ServicePermissionAttribute : Attribute 4 | { 5 | 6 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UINameAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes 2 | { 3 | public class UINameAttribute : Attribute 4 | { 5 | 6 | } 7 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Dtos/Data/BatchInput.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Dtos.Data; 2 | 3 | public class BatchInput : Input 4 | { 5 | public Input[]? entities { get; set; } 6 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/audit_admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/audit_admin.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/audit_config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/audit_config.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/audit_history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/audit_history.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/firebase_auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/firebase_auth.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/logging_admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/logging_admin.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/widget_form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/widget_form.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/widget_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/widget_table.png -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/.env.production: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_NAME="prod" 2 | NEXT_PUBLIC_API="" 3 | NEXTAUTH_URL="https://xxx.com" 4 | SECRET="1d2fe93438b102edcc2d6d93ae2caa06" -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/api/TablesResponse.tsx: -------------------------------------------------------------------------------- 1 | export interface TablesResponse { 2 | tableName: string; 3 | displayName: string; 4 | tag: string; 5 | } 6 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/attribute_required.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/attribute_required.png -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/.env.test: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_NAME="test" 2 | NEXT_PUBLIC_API="https://api.xxx.com" 3 | NEXTAUTH_URL="https://xxx.com" 4 | SECRET="2d2fe23138b302edcc223343ae2caa01" -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/.env.test: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_NAME="test" 2 | NEXT_PUBLIC_API="https://api.xxx.com" 3 | NEXTAUTH_URL="https://xxx.com" 4 | SECRET="2d2fe23138b302edcc223343ae2caa01" -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/admin_create_option.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/admin_create_option.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/audit_field_history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/audit_field_history.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/option_create_widget.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/option_create_widget.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/order_create_uiname.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/order_create_uiname.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/realtime_permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/realtime_permissions.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/widget_import_export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/widget_import_export.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/widget_table_create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/widget_table_create.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/widget_uirecommended.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/widget_uirecommended.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/xams_security_schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/xams_security_schema.png -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/api/Request.tsx: -------------------------------------------------------------------------------- 1 | export interface Request { 2 | tableName?: string; 3 | fields?: any; 4 | parameters?: any; 5 | entities?: Request[] | any[]; 6 | } 7 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/attribute_displayname.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/attribute_displayname.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/attribute_uimultiselect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/attribute_uimultiselect.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/audit_history_details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/audit_history_details.png -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/api/Request.tsx: -------------------------------------------------------------------------------- 1 | export interface Request { 2 | tableName?: string; 3 | fields?: any; 4 | parameters?: any; 5 | entities?: Request[] | any[]; 6 | } 7 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/order_create_uidescription.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/order_create_uidescription.png -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/diagrams/crud_architecture_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ixetanet/xams/HEAD/xams-mcp-server/docs/xams-docs-v1/src/images/diagrams/crud_architecture_diagram.png -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/mdx/remark.mjs: -------------------------------------------------------------------------------- 1 | import { mdxAnnotations } from 'mdx-annotations' 2 | import remarkGfm from 'remark-gfm' 3 | 4 | export const remarkPlugins = [mdxAnnotations.remark, remarkGfm] 5 | -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/Config.cs: -------------------------------------------------------------------------------- 1 | namespace MyXProject.Web; 2 | 3 | public class Config 4 | { 5 | public static readonly string? Environment = System.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); 6 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/prettier.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('prettier').Options} */ 2 | module.exports = { 3 | singleQuote: true, 4 | semi: false, 5 | plugins: ['prettier-plugin-tailwindcss'], 6 | } 7 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/api/Permission.tsx: -------------------------------------------------------------------------------- 1 | import { UIInfo } from "./UIInfo"; 2 | export interface Permission { 3 | Name: string; 4 | PermissionId: string; 5 | Tag: string; 6 | _ui_info_: UIInfo; 7 | } 8 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/api/Permission.tsx: -------------------------------------------------------------------------------- 1 | import { UIInfo } from "./UIInfo"; 2 | export interface Permission { 3 | Name: string; 4 | PermissionId: string; 5 | Tag: string; 6 | _ui_info_: UIInfo; 7 | } 8 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/pages/admin.tsx: -------------------------------------------------------------------------------- 1 | import { AdminDashboard } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const Admin = () => { 5 | return ; 6 | }; 7 | 8 | export default Admin; 9 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/api/ApiResponse.tsx: -------------------------------------------------------------------------------- 1 | export interface ApiResponse { 2 | succeeded: boolean; 3 | data: T; 4 | friendlyMessage: string; 5 | logMessage: string; 6 | response: Response | undefined; 7 | } 8 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/api/ApiResponse.tsx: -------------------------------------------------------------------------------- 1 | export interface ApiResponse { 2 | succeeded: boolean; 3 | data: T; 4 | friendlyMessage: string; 5 | logMessage: string; 6 | response: Response | undefined; 7 | } 8 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/api/BulkRequest.tsx: -------------------------------------------------------------------------------- 1 | import { Request } from "./Request"; 2 | 3 | export interface BulkRequest { 4 | creates?: Request[]; 5 | updates?: Request[]; 6 | deletes?: Request[]; 7 | upserts?: Request[]; 8 | } 9 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/api/BulkRequest.tsx: -------------------------------------------------------------------------------- 1 | import { Request } from "./Request"; 2 | 3 | export interface BulkRequest { 4 | creates?: Request[]; 5 | updates?: Request[]; 6 | deletes?: Request[]; 7 | upserts?: Request[]; 8 | } 9 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Dtos/Data/FileInput.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Http; 2 | 3 | namespace Xams.Core.Dtos.Data 4 | { 5 | public class FileInput : ActionInput 6 | { 7 | public IFormFile file { get; set; } 8 | 9 | } 10 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Interfaces/IServiceJob.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Contexts; 2 | using Xams.Core.Dtos; 3 | 4 | namespace Xams.Core.Interfaces; 5 | 6 | public interface IServiceJob 7 | { 8 | public Task> Execute(JobServiceContext context); 9 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Interfaces/IBulkService.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Contexts; 2 | using Xams.Core.Dtos; 3 | 4 | namespace Xams.Core.Interfaces; 5 | 6 | public interface IBulkService 7 | { 8 | public Task> Execute(BulkServiceContext context); 9 | } -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | export default { 4 | content: ["./src/**/*.{js,ts,jsx,tsx,mdx}"], 5 | theme: { 6 | extend: {}, 7 | }, 8 | plugins: [], 9 | } satisfies Config; 10 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Dtos/Data/MetadataInput.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json; 2 | 3 | namespace Xams.Core.Dtos.Data; 4 | 5 | public class MetadataInput 6 | { 7 | public string method { get; set; } 8 | public Dictionary? parameters { get; set; } 9 | } -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | export default { 4 | content: ["./src/**/*.{js,ts,jsx,tsx,mdx}"], 5 | theme: { 6 | extend: {}, 7 | }, 8 | plugins: [], 9 | } satisfies Config; 10 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Dtos/Data/PermissionsInput.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json; 2 | 3 | namespace Xams.Core.Dtos.Data; 4 | 5 | public class PermissionsInput 6 | { 7 | public string method { get; set; } 8 | public Dictionary? parameters { get; set; } 9 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Dtos/Data/TablesOutput.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Dtos.Data 2 | { 3 | public class TablesOutput 4 | { 5 | public string tableName { get; set; } 6 | public string displayName { get; set; } 7 | public string tag { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UIOptionAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class UIOptionAttribute : Attribute 4 | { 5 | public string Name { get; set; } 6 | public UIOptionAttribute(string name) 7 | { 8 | this.Name = name; 9 | } 10 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/JobTimeZone.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class JobTimeZone : Attribute 4 | { 5 | public string TimeZone { get; private set; } 6 | public JobTimeZone(string timeZone) 7 | { 8 | TimeZone = timeZone; 9 | } 10 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Dtos/ApiResponse.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Dtos; 2 | 3 | public class ApiResponse 4 | { 5 | public bool succeeded { get; set; } 6 | public string? friendlyMessage { get; set; } 7 | public string? logMessage { get; set; } 8 | public dynamic? data { get; set; } 9 | } -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | export default { 4 | content: ["./src/**/*.{js,ts,jsx,tsx,mdx}"], 5 | theme: { 6 | extend: {}, 7 | }, 8 | plugins: [], 9 | prefix: "i", 10 | } satisfies Config; 11 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-firebase/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | export default { 4 | content: ["./src/**/*.{js,ts,jsx,tsx,mdx}"], 5 | theme: { 6 | extend: {}, 7 | }, 8 | plugins: [], 9 | prefix: "i", 10 | } satisfies Config; 11 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/ServiceHubAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class ServiceHubAttribute : Attribute 4 | { 5 | public string Name { get; set; } 6 | 7 | public ServiceHubAttribute(string name) 8 | { 9 | Name = name; 10 | } 11 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Dtos/Data/ActionInput.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json; 2 | 3 | namespace Xams.Core.Dtos.Data 4 | { 5 | public class ActionInput 6 | { 7 | public string name { get; set; } 8 | public Dictionary? parameters { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Dtos/Data/BulkInput.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Dtos.Data; 2 | 3 | public class BulkInput 4 | { 5 | public Input[]? Creates { get; set; } 6 | public Input[]? Updates { get; set; } 7 | public Input[]? Deletes { get; set; } 8 | public Input[]? Upserts { get; set; } 9 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/wwwroot/xams/_next/static/chunks/pages/_error-04e1fb7a67d4f61e.js: -------------------------------------------------------------------------------- 1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[731],{510:(_,n,e)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/_error",function(){return e(5131)}])}},_=>{_.O(0,[255,593,792],()=>_(_.s=510)),_N_E=_.O()}]); -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/pages/test.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const Test = () => { 5 | return ( 6 |
7 | 8 |
9 | ); 10 | }; 11 | 12 | export default Test; 13 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-firebase/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | export default { 4 | content: ["./src/**/*.{js,ts,jsx,tsx,mdx}"], 5 | theme: { 6 | extend: {}, 7 | }, 8 | plugins: [], 9 | prefix: "i", 10 | } satisfies Config; 11 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-supabase/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | export default { 4 | content: ["./src/**/*.{js,ts,jsx,tsx,mdx}"], 5 | theme: { 6 | extend: {}, 7 | }, 8 | plugins: [], 9 | prefix: "i", 10 | } satisfies Config; 11 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/ServiceSecurityAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class ServiceSecurityAttribute : Attribute 4 | { 5 | public int Order { get; set; } 6 | public ServiceSecurityAttribute(int order = 100) 7 | { 8 | Order = order; 9 | } 10 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/lib/remToPx.ts: -------------------------------------------------------------------------------- 1 | export function remToPx(remValue: number) { 2 | let rootFontSize = 3 | typeof window === 'undefined' 4 | ? 16 5 | : parseFloat(window.getComputedStyle(document.documentElement).fontSize) 6 | 7 | return remValue * rootFontSize 8 | } 9 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/api/RolePermission.tsx: -------------------------------------------------------------------------------- 1 | import { UIInfo } from "./UIInfo"; 2 | 3 | export interface RolePermission { 4 | RolePermissionId?: string; 5 | RoleId?: string; 6 | Role?: string; 7 | PermissionId?: string; 8 | Permission?: string; 9 | _ui_info_?: UIInfo; 10 | } 11 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UICharacterLimitAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class UICharacterLimitAttribute : Attribute 4 | { 5 | public int Limit { get; set; } 6 | public UICharacterLimitAttribute(int limit) 7 | { 8 | this.Limit = limit; 9 | } 10 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/mdx-components.tsx: -------------------------------------------------------------------------------- 1 | import * as mdxComponents from '@/components/mdx' 2 | import { type MDXComponents } from 'mdx/types' 3 | 4 | export function useMDXComponents(components: MDXComponents) { 5 | return { 6 | ...components, 7 | ...mdxComponents, 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/api/RolePermission.tsx: -------------------------------------------------------------------------------- 1 | import { UIInfo } from "./UIInfo"; 2 | 3 | export interface RolePermission { 4 | RolePermissionId?: string; 5 | RoleId?: string; 6 | Role?: string; 7 | PermissionId?: string; 8 | Permission?: string; 9 | _ui_info_?: UIInfo; 10 | } 11 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UIOrderAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes 2 | { 3 | public class UIOrderAttribute : Attribute 4 | { 5 | public int Order { get; set; } 6 | public UIOrderAttribute(int order) 7 | { 8 | this.Order = order; 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Interfaces/IPipelineStage.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Dtos; 2 | using Xams.Core.Pipeline; 3 | 4 | namespace Xams.Core.Interfaces; 5 | 6 | public interface IPipelineStage 7 | { 8 | public Task> Execute(PipelineContext context); 9 | public void SetNext(IPipelineStage nextItem); 10 | } -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/src/types.d.ts: -------------------------------------------------------------------------------- 1 | export interface FirebaseConfig { 2 | apiKey: string; 3 | authDomain: string; 4 | projectId: string; 5 | storageBucket: string; 6 | messagingSenderId: string; 7 | appId: string; 8 | providers: string[]; 9 | enableSmsMfa: boolean; 10 | redirectUrls: string[]; 11 | } 12 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/ServiceActionAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes 2 | { 3 | public class ServiceActionAttribute : Attribute 4 | { 5 | public string Name { get; set; } 6 | 7 | public ServiceActionAttribute(string name) 8 | { 9 | Name = name; 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/src/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import { Html, Head, Main, NextScript } from 'next/document' 2 | 3 | export default function Document() { 4 | return ( 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react/styles.css: -------------------------------------------------------------------------------- 1 | /* @tailwind base; */ 2 | 3 | .iflex { 4 | display: flex 5 | } 6 | 7 | .ih-36 { 8 | height: 9rem 9 | } 10 | 11 | .iw-32 { 12 | width: 8rem 13 | } 14 | 15 | .iitems-center { 16 | align-items: center 17 | } 18 | 19 | .ijustify-center { 20 | justify-content: center 21 | } 22 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-firebase/styles.css: -------------------------------------------------------------------------------- 1 | /* @tailwind base; */ 2 | 3 | .iflex { 4 | display: flex 5 | } 6 | 7 | .ih-36 { 8 | height: 9rem 9 | } 10 | 11 | .iw-32 { 12 | width: 8rem 13 | } 14 | 15 | .iitems-center { 16 | align-items: center 17 | } 18 | 19 | .ijustify-center { 20 | justify-content: center 21 | } 22 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-firebase/styles.css: -------------------------------------------------------------------------------- 1 | /* @tailwind base; */ 2 | 3 | .iflex { 4 | display: flex 5 | } 6 | 7 | .ih-36 { 8 | height: 9rem 9 | } 10 | 11 | .iw-32 { 12 | width: 8rem 13 | } 14 | 15 | .iitems-center { 16 | align-items: center 17 | } 18 | 19 | .ijustify-center { 20 | justify-content: center 21 | } 22 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-supabase/styles.css: -------------------------------------------------------------------------------- 1 | /* @tailwind base; */ 2 | 3 | .iflex { 4 | display: flex 5 | } 6 | 7 | .ih-36 { 8 | height: 9rem 9 | } 10 | 11 | .iw-32 { 12 | width: 8rem 13 | } 14 | 15 | .iitems-center { 16 | align-items: center 17 | } 18 | 19 | .ijustify-center { 20 | justify-content: center 21 | } 22 | -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/dbreset.sh: -------------------------------------------------------------------------------- 1 | rm -r Migrations 2 | 3 | docker stop myxproject 4 | docker rm myxproject 5 | docker run --name myxproject -p 6001:5432 -e POSTGRES_PASSWORD=pgpass -e POSTGRES_USER=pgadmin -d postgres 6 | 7 | export ASPNETCORE_ENVIRONMENT=Local 8 | dotnet ef migrations add migration01 9 | dotnet ef database update -- --environment Local -------------------------------------------------------------------------------- /core/xams/Xams.Core/Interfaces/IServiceAction.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Contexts; 2 | using Xams.Core.Dtos; 3 | 4 | namespace Xams.Core.Interfaces; 5 | 6 | /// 7 | /// Execute a service action. 8 | /// 9 | public interface IServiceAction 10 | { 11 | public Task> Execute(ActionServiceContext context); 12 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Interfaces/IServiceStartup.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Contexts; 2 | using Xams.Core.Dtos; 3 | 4 | namespace Xams.Core.Interfaces; 5 | 6 | /// 7 | /// Executes logic on startup. 8 | /// 9 | public interface IServiceStartup 10 | { 11 | public Task> Execute(StartupContext startupContext); 12 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/types.d.ts: -------------------------------------------------------------------------------- 1 | import { type SearchOptions } from 'flexsearch' 2 | 3 | declare module '@/mdx/search.mjs' { 4 | export type Result = { 5 | url: string 6 | title: string 7 | pageTitle?: string 8 | } 9 | 10 | export function search(query: string, options?: SearchOptions): Array 11 | } 12 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Interfaces/IResponse.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Interfaces 2 | { 3 | public interface IResponse 4 | { 5 | public bool Succeeded { get; set; } 6 | public string? FriendlyMessage { get; set; } 7 | public string? LogMessage { get; set; } 8 | 9 | public T? Data { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/api/AuditField.tsx: -------------------------------------------------------------------------------- 1 | import { UIInfo } from "./UIInfo"; 2 | 3 | export interface AuditField { 4 | AuditFieldId: string; 5 | Name: string; 6 | AuditId: string; 7 | Audit: string; 8 | IsCreate: boolean; 9 | IsRead: boolean; 10 | IsUpdate: boolean; 11 | IsDelete: boolean; 12 | _ui_info_: UIInfo; 13 | } 14 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/api/AuditField.tsx: -------------------------------------------------------------------------------- 1 | import { UIInfo } from "./UIInfo"; 2 | 3 | export interface AuditField { 4 | AuditFieldId: string; 5 | Name: string; 6 | AuditId: string; 7 | Audit: string; 8 | IsCreate: boolean; 9 | IsRead: boolean; 10 | IsUpdate: boolean; 11 | IsDelete: boolean; 12 | _ui_info_: UIInfo; 13 | } 14 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/api/ReadResponse.tsx: -------------------------------------------------------------------------------- 1 | import { ReadOrderBy } from "./ReadRequest"; 2 | 3 | export type ReadResponse = { 4 | pages: number; 5 | currentPage: number; 6 | totalResults: number; 7 | maxResults: number; 8 | tableName: string; 9 | orderBy?: ReadOrderBy[]; 10 | results: T[]; 11 | parameters: U; 12 | }; 13 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/api/ReadResponse.tsx: -------------------------------------------------------------------------------- 1 | import { ReadOrderBy } from "./ReadRequest"; 2 | 3 | export type ReadResponse = { 4 | pages: number; 5 | currentPage: number; 6 | totalResults: number; 7 | maxResults: number; 8 | tableName: string; 9 | orderBy?: ReadOrderBy[]; 10 | results: T[]; 11 | parameters: U; 12 | }; 13 | -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "AllowedHosts": "*", 9 | "Jwt": { 10 | "Issuer": "myxproject", 11 | "Audience": "myxprojectUser", 12 | "Key": "38d7735d-355c-49cb-864a-014918892456" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UINumberRangeAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class UINumberRangeAttribute : Attribute 4 | { 5 | public float Min { get; set; } 6 | public float Max { get; set; } 7 | 8 | public UINumberRangeAttribute(float min, float max) 9 | { 10 | Min = min; 11 | Max = max; 12 | } 13 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Utils/StringExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Utils; 2 | 3 | internal static class StringExtensions 4 | { 5 | public static string? Truncate(this string? value, int maxLength) 6 | { 7 | if (string.IsNullOrEmpty(value)) return value; 8 | return value.Length <= maxLength ? value : value.Substring(0, maxLength); 9 | } 10 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Xams Framework 2 | 3 | [Website](https://xams.io/) 4 | 5 | Xams is a framework built to accelerate application development. It utilizes React for the front end and C# .NET for the application layer. With tight integration into the Entity Framework, Xams offers compatibility with a variety of databases, including SQLite, MySQL, PostgreSQL, and Microsoft SQL Server. 6 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Extensions/ExtensionMethods.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Dtos.Data; 2 | using Xams.Core.Utils; 3 | 4 | namespace Xams.Core.Extensions; 5 | 6 | public static class ExtensionMethods 7 | { 8 | public static string[] GetTables(this ReadInput? readInput) 9 | { 10 | // Get all tables 11 | return QueryUtil.GetTables(readInput); 12 | } 13 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Interfaces/IServiceLogic.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Contexts; 2 | using Xams.Core.Dtos; 3 | 4 | namespace Xams.Core.Interfaces; 5 | 6 | /// 7 | /// Execute a service logic on create, read, update, or delete. 8 | /// 9 | public interface IServiceLogic 10 | { 11 | public Task> Execute(ServiceContext context); 12 | } 13 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/JobInitialStateAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public enum JobState 4 | { 5 | Active, 6 | Inactive, 7 | } 8 | 9 | public class JobInitialStateAttribute : Attribute 10 | { 11 | public JobState State { get; } 12 | public JobInitialStateAttribute(JobState state) 13 | { 14 | State = state; 15 | } 16 | } -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-firebase/src/index.ts: -------------------------------------------------------------------------------- 1 | // export type { AuthConfig } from "./AuthConfig"; 2 | export { LoginComponent } from "./components/auth/LoginComponent"; 3 | export { LoginProvider } from "./components/auth/LoginContext"; 4 | export { LoginContainer } from "./components/auth/LoginContainer"; 5 | export { ResetPasswordForm } from "./components/auth/login/ResetPasswordForm"; 6 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/JobServerAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public enum ExecuteJobOn 4 | { 5 | All, 6 | One 7 | } 8 | 9 | public class JobServerAttribute(ExecuteJobOn executeJobOn, string? serverName = null) : Attribute 10 | { 11 | public ExecuteJobOn ExecuteJobOn { get; } = executeJobOn; 12 | public string? ServerName { get; } = serverName; 13 | } -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react/src/AuthConfigOptions.ts: -------------------------------------------------------------------------------- 1 | import { AuthConfig } from "./AuthConfig"; 2 | 3 | export type AuthConfigOptions = { 4 | onSignUpSuccess?: (authConfig: AuthConfig) => Promise; 5 | onSignInSuccess?: (authConfig: AuthConfig) => Promise; 6 | onSignOutSuccess?: (authConfig: AuthConfig) => Promise; 7 | onSignInError?: (error: Error) => Promise; 8 | }; 9 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/pages/api/hello.ts: -------------------------------------------------------------------------------- 1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction 2 | import type { NextApiRequest, NextApiResponse } from 'next' 3 | 4 | type Data = { 5 | name: string 6 | } 7 | 8 | export default function handler( 9 | req: NextApiRequest, 10 | res: NextApiResponse 11 | ) { 12 | res.status(200).json({ name: 'John Doe' }) 13 | } 14 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/wwwroot/xams/_next/static/chunks/pages/profile-d694ec5a5e9087b4.js: -------------------------------------------------------------------------------- 1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[63],{5734:(_,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>r});var s=n(6514);n(5834);var u=n(110);let r=()=>(0,s.jsx)(u.n7,{})},9334:(_,e,n)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/profile",function(){return n(5734)}])}},_=>{_.O(0,[255,593,792],()=>_(_.s=9334)),_N_E=_.O()}]); -------------------------------------------------------------------------------- /core/xams/Xams.Core/Contexts/JobServiceContext.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json; 2 | using Xams.Core.Base; 3 | using Xams.Core.Interfaces; 4 | using Xams.Core.Pipeline; 5 | using Xams.Core.Repositories; 6 | 7 | namespace Xams.Core.Contexts; 8 | 9 | public class JobServiceContext : BaseServiceContext 10 | { 11 | public JobServiceContext(PipelineContext pipelineContext) : base(pipelineContext) 12 | { 13 | } 14 | } -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react/src/index.ts: -------------------------------------------------------------------------------- 1 | export type { AuthConfig } from "./AuthConfig"; 2 | export type { AuthConfigOptions } from "./AuthConfigOptions"; 3 | export type { Factor } from "./AuthConfig"; 4 | export type { AuthResponse } from "./AuthConfig"; 5 | export { AuthProvider } from "./AuthContext"; 6 | export { useAuth } from "./useAuth"; 7 | export { getMobileDevice as getMobileDevice } from "./utils/getDeviceType"; 8 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/README.md: -------------------------------------------------------------------------------- 1 | # NuGet Package for Xams Framework 2 | 3 | ## License 4 | 5 | This software is provided under the [NuGet Package License](LICENSE). You are free to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software. 6 | 7 | ## Disclaimer 8 | 9 | The Software is provided "AS IS", without warranty of any kind. For more details, please refer to the license file. 10 | 11 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/wwwroot/xams/_next/static/chunks/pages/__/auth/action-db7ccbeab52656af.js: -------------------------------------------------------------------------------- 1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[636],{718:(_,u,e)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/__/auth/action",function(){return e(3895)}])},3895:(_,u,e)=>{"use strict";e.r(u),e.d(u,{default:()=>t});var n=e(6514);e(5834);var s=e(110);let t=()=>(0,n.jsx)(s.gb,{})}},_=>{_.O(0,[255,593,792],()=>_(_.s=718)),_N_E=_.O()}]); -------------------------------------------------------------------------------- /core/xams/Xams.Core/wwwroot/xams/_next/static/chunks/pages/reset-password-c41c8524f84c6343.js: -------------------------------------------------------------------------------- 1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[537],{9196:(_,s,e)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/reset-password",function(){return e(9514)}])},9514:(_,s,e)=>{"use strict";e.r(s),e.d(s,{default:()=>n});var r=e(6514);e(5834);var u=e(110);let n=()=>(0,r.jsx)(u.Yk,{})}},_=>{_.O(0,[255,593,792],()=>_(_.s=9196)),_N_E=_.O()}]); -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/BoltIcon.tsx: -------------------------------------------------------------------------------- 1 | export function BoltIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/Permission.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace Xams.Core.Entities; 5 | 6 | [Table(nameof(Permission))] 7 | public class Permission 8 | { 9 | public Guid PermissionId { get; set; } 10 | [MaxLength(300)] 11 | public string? Name { get; set; } 12 | [MaxLength(250)] 13 | public string? Tag { get; set; } 14 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UIRequiredAttribute.cs: -------------------------------------------------------------------------------- 1 | // ReSharper disable InconsistentNaming 2 | namespace Xams.Core.Attributes; 3 | 4 | public class UIRequiredAttribute : Attribute 5 | { 6 | public string[] Fields { get; private set; } 7 | public UIRequiredAttribute() 8 | { 9 | Fields = []; 10 | } 11 | 12 | public UIRequiredAttribute(params string[] fields) 13 | { 14 | Fields = fields; 15 | } 16 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Pipeline/Stages/PipeResultEmpty.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Base; 2 | using Xams.Core.Dtos; 3 | 4 | namespace Xams.Core.Pipeline.Stages; 5 | 6 | public class PipeResultEmpty : BasePipelineStage 7 | { 8 | public override Task> Execute(PipelineContext context) 9 | { 10 | return Task.FromResult(new Response() 11 | { 12 | Succeeded = true 13 | }); 14 | } 15 | } -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/hooks/useGuid.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { v4 as uuidv4, validate as uuidValidate } from "uuid"; 3 | 4 | const useGuid = () => { 5 | const getGuid = () => { 6 | return uuidv4(); 7 | }; 8 | 9 | const validate = (str: string) => { 10 | return uuidValidate(str); 11 | }; 12 | return { 13 | get: getGuid, 14 | validate: validate, 15 | }; 16 | }; 17 | 18 | export default useGuid; 19 | -------------------------------------------------------------------------------- /core/xams/Xams.Console/Xams.Console.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net8.0 6 | enable 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UIRecommendedAttribute.cs: -------------------------------------------------------------------------------- 1 | // ReSharper disable InconsistentNaming 2 | namespace Xams.Core.Attributes; 3 | 4 | public class UIRecommendedAttribute : Attribute 5 | { 6 | public string[] Fields { get; private set; } 7 | public UIRecommendedAttribute() 8 | { 9 | Fields = []; 10 | } 11 | 12 | public UIRecommendedAttribute(params string [] fields) 13 | { 14 | Fields = fields; 15 | } 16 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/BulkServiceAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public enum BulkStage 4 | { 5 | Pre, 6 | Post 7 | } 8 | public class BulkServiceAttribute : Attribute 9 | { 10 | public int Order { get; set; } 11 | public BulkStage Stage { get; set; } 12 | 13 | public BulkServiceAttribute(BulkStage bulkStage, int order = 0) 14 | { 15 | Stage = bulkStage; 16 | Order = order; 17 | } 18 | } -------------------------------------------------------------------------------- /core/xams/.dockerignore: -------------------------------------------------------------------------------- 1 | **/.dockerignore 2 | **/.env 3 | **/.git 4 | **/.gitignore 5 | **/.project 6 | **/.settings 7 | **/.toolstarget 8 | **/.vs 9 | **/.vscode 10 | **/.idea 11 | **/*.*proj.user 12 | **/*.dbmdl 13 | **/*.jfm 14 | **/azds.yaml 15 | **/bin 16 | **/charts 17 | **/docker-compose* 18 | **/Dockerfile* 19 | **/node_modules 20 | **/npm-debug.log 21 | **/obj 22 | **/secrets.dev.yaml 23 | **/values.dev.yaml 24 | LICENSE 25 | README.md -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/src/styles/globals.css: -------------------------------------------------------------------------------- 1 | /* @tailwind base; */ 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --foreground-rgb: 0, 0, 0; 7 | --background-start-rgb: 214, 219, 220; 8 | --background-end-rgb: 255, 255, 255; 9 | } 10 | 11 | @media (prefers-color-scheme: dark) { 12 | :root { 13 | --foreground-rgb: 255, 255, 255; 14 | --background-start-rgb: 0, 0, 0; 15 | --background-end-rgb: 0, 0, 0; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableTitle.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTableTitle = () => { 5 | return ( 6 | <> 7 |

The DataTable title can be customized by setting the title prop.

8 |
9 | 10 |
11 | 12 | ); 13 | }; 14 | 15 | export default DataTableTitle; 16 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/Team.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace Xams.Core.Entities; 5 | 6 | [Table("Team")] 7 | public class Team 8 | { 9 | public Guid TeamId { get; set; } 10 | [MaxLength(250)] 11 | public string? Name { get; set; } 12 | 13 | public int Discriminator { get; set; } 14 | 15 | // public ICollection TeamRoles { get; set; } = null!; 16 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/TeamUser.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations.Schema; 2 | 3 | namespace Xams.Core.Entities; 4 | 5 | [Table("TeamUser")] 6 | public class TeamUser 7 | where TUser : User 8 | where TTeam : Team 9 | { 10 | public Guid TeamUserId { get; set; } 11 | public Guid TeamId { get; set; } 12 | public TTeam Team { get; set; } = null!; 13 | public Guid UserId { get; set; } 14 | public TUser User { get; set; } = null!; 15 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/wwwroot/xams/_next/static/chunks/pages/login-c58f0b4152312724.js: -------------------------------------------------------------------------------- 1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[295],{538:(e,u,s)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/login",function(){return s(5770)}])},5770:(e,u,s)=>{"use strict";s.r(u),s.d(u,{default:()=>t});var _=s(6514);s(5834);var n=s(6225),r=s(110);let t=()=>{let e=(0,n.useRouter)();return(0,_.jsx)(r.rN,{onLoginSuccess:()=>e.push("/")})}}},e=>{e.O(0,[255,593,792],()=>e(e.s=538)),_N_E=e.O()}]); -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react/src/utils/getDeviceType.ts: -------------------------------------------------------------------------------- 1 | export const getMobileDevice = () => { 2 | const userAgent = 3 | navigator.userAgent || navigator.vendor || (window as any).opera; 4 | 5 | // Android detection 6 | if (/android/i.test(userAgent)) { 7 | return "Android"; 8 | } 9 | 10 | // iOS detection 11 | if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) { 12 | return "iOS"; 13 | } 14 | 15 | return "unknown"; 16 | }; 17 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/Server.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | using Xams.Core.Attributes; 4 | 5 | namespace Xams.Core.Entities; 6 | 7 | [Table(nameof(Server))] 8 | public class Server 9 | { 10 | public Guid ServerId { get; set; } 11 | [MaxLength(200)] 12 | public string Name { get; set; } = null!; 13 | [UIDateFormat("MMM D, h:mm:ss A")] 14 | public DateTime LastPing { get; set; } 15 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/TeamRole.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations.Schema; 2 | 3 | namespace Xams.Core.Entities; 4 | 5 | [Table("TeamRole")] 6 | public class TeamRole 7 | where TTeam : Team 8 | where TRole : Role 9 | { 10 | public Guid TeamRoleId { get; set; } 11 | public Guid TeamId { get; set; } 12 | public TTeam Team { get; set; } = null!; 13 | public Guid RoleId { get; set; } 14 | public TRole Role { get; set; } = null!; 15 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/UserRole.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations.Schema; 2 | 3 | namespace Xams.Core.Entities; 4 | 5 | [Table("UserRole")] 6 | public class UserRole 7 | where TUser : User 8 | where TRole : Role 9 | { 10 | public Guid UserRoleId { get; set; } 11 | public TUser User { get; set; } = null!; 12 | public Guid UserId { get; set; } 13 | public TRole Role { get; set; } = null!; 14 | public Guid RoleId { get; set; } 15 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/ShirtIcon.tsx: -------------------------------------------------------------------------------- 1 | export function ShirtIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/src/utils/verifyEmailUtil.ts: -------------------------------------------------------------------------------- 1 | export const verifyEmail = async (email: string) => { 2 | const resp = await fetch(`${process.env.NEXT_PUBLIC_API}/xams/verifyemail`, { 3 | method: "POST", 4 | headers: { 5 | "Content-Type": "application/json", 6 | }, 7 | body: JSON.stringify({ email }), 8 | }); 9 | if (!resp.ok) { 10 | console.error("Error verifying email:", resp.statusText); 11 | return null; 12 | } 13 | return null; 14 | }; 15 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UIMultiSelect.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class UIMultiSelectAttribute : Attribute 4 | { 5 | public string JunctionOwnerIdField { get; set; } 6 | public string JunctionTargetIdField { get; set; } 7 | 8 | public UIMultiSelectAttribute(string junctionOwnerIdField, string junctionTargetIdField) 9 | { 10 | JunctionOwnerIdField = junctionOwnerIdField; 11 | JunctionTargetIdField = junctionTargetIdField; 12 | } 13 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UIReadOnlyAttribute.cs: -------------------------------------------------------------------------------- 1 | // ReSharper disable InconsistentNaming 2 | namespace Xams.Core.Attributes 3 | { 4 | public class UIReadOnlyAttribute : Attribute 5 | { 6 | public string[] Fields { get; private set; } 7 | public UIReadOnlyAttribute() 8 | { 9 | Fields = []; 10 | } 11 | 12 | public UIReadOnlyAttribute(params string[] fields) 13 | { 14 | Fields = fields; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/RolePermission.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations.Schema; 2 | 3 | namespace Xams.Core.Entities; 4 | 5 | [Table("RolePermission")] 6 | public class RolePermission 7 | where TRole : Role 8 | { 9 | public Guid RolePermissionId { get; set; } 10 | public Guid RoleId { get; set; } 11 | public TRole Role { get; set; } = null!; 12 | public Guid PermissionId { get; set; } 13 | public Permission Permission { get; set; } = null!; 14 | } -------------------------------------------------------------------------------- /xams-mcp-server/.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | node_modules/ 3 | 4 | # Build output 5 | build/ 6 | dist/ 7 | 8 | # Logs 9 | *.log 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | lerna-debug.log* 14 | 15 | # OS files 16 | .DS_Store 17 | Thumbs.db 18 | 19 | # IDE 20 | .vscode/ 21 | .idea/ 22 | *.swp 23 | *.swo 24 | *~ 25 | 26 | # Testing 27 | coverage/ 28 | 29 | # Environment 30 | .env 31 | .env.local 32 | .env.*.local 33 | 34 | # Temporary files 35 | *.tmp 36 | .cache 37 | -------------------------------------------------------------------------------- /cli/Xams.Cli/CreateNextJs.cs: -------------------------------------------------------------------------------- 1 | using Xams.Cli.Utils; 2 | 3 | namespace Xams.Cli; 4 | 5 | public class CreateNextJs 6 | { 7 | public async Task Execute(Download.DownloadOptions options) 8 | { 9 | options.Mutations = async (context) => 10 | { 11 | ReplaceUtil.ReplaceTextInFiles(context.ProjectDirectory, " \"name\": \"my-app\",", $" \"name\": \"{context.ProjectName}\","); 12 | }; 13 | 14 | await new Download().Execute(options); 15 | } 16 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/Role.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace Xams.Core.Entities; 5 | 6 | [Table(nameof(Role))] 7 | public class Role 8 | { 9 | public Guid RoleId { get; set; } 10 | [MaxLength(250)] 11 | public string? Name { get; set; } 12 | 13 | public int Discriminator { get; set; } 14 | 15 | // public ICollection RolePermissions { get; set; } = null!; 16 | } -------------------------------------------------------------------------------- /.claude/settings.local.json: -------------------------------------------------------------------------------- 1 | { 2 | "permissions": { 3 | "allow": [ 4 | "Bash(mkdir:*)", 5 | "Bash(grep:*)", 6 | "Bash(npm install)", 7 | "Bash(sudo rm:*)", 8 | "Bash(npm install:*)", 9 | "Bash(npm run build:tsc:*)", 10 | "Bash(npm ls:*)", 11 | "WebSearch", 12 | "Bash(npm run build:*)", 13 | "Bash(npm run lint)", 14 | "WebFetch(domain:help.mantine.dev)" 15 | ], 16 | "defaultMode": "acceptEdits" 17 | }, 18 | "outputStyle": "default" 19 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UICreateOnlyAttribute.cs: -------------------------------------------------------------------------------- 1 | // ReSharper disable InconsistentNaming 2 | namespace Xams.Core.Attributes 3 | { 4 | public class UICreateOnlyAttribute : Attribute 5 | { 6 | public string[] Fields { get; private set; } 7 | 8 | public UICreateOnlyAttribute() 9 | { 10 | Fields = []; 11 | } 12 | 13 | public UICreateOnlyAttribute(params string[] fields) 14 | { 15 | Fields = fields; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Dtos/Data/Input.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json; 2 | 3 | namespace Xams.Core.Dtos.Data 4 | { 5 | public class Input 6 | { 7 | public object? id { get; set; } // primary id field 8 | public string? tableName { get; set; } // Could be null in the case of a batch operation 9 | public Dictionary? fields { get; set; } // Could be null in the case of a batch operation 10 | public Dictionary? parameters { get; set; } 11 | } 12 | } -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | output: "export", 4 | images: { 5 | unoptimized: true, 6 | }, 7 | trailingSlash: false, 8 | reactStrictMode: true, 9 | transpilePackages: ["@ixeta/xams"], 10 | }; 11 | 12 | const withBundleAnalyzer = require("@next/bundle-analyzer")({ 13 | enabled: process.env.ANALYZE === "true", 14 | }); 15 | module.exports = withBundleAnalyzer(nextConfig); 16 | 17 | // module.exports = nextConfig 18 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/LinkIcon.tsx: -------------------------------------------------------------------------------- 1 | export function LinkIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DTFormMaxWidth.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DTFormMaxWidth = () => { 5 | return ( 6 | <> 7 |

8 | The formMaxWidth prop can be used to set the maximum width of the form 9 | in rem. 10 |

11 |
12 | 13 |
14 | 15 | ); 16 | }; 17 | 18 | export default DTFormMaxWidth; 19 | -------------------------------------------------------------------------------- /core/xams-workspace/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-workspaces-powered-project", 3 | "workspaces": [ 4 | "ixeta-xams", 5 | "ixeta-xams-firebase", 6 | "examples-app", 7 | "admin-dash", 8 | "headless-auth-react", 9 | "headless-auth-react-firebase", 10 | "headless-auth-react-supabase" 11 | ], 12 | "devDependencies": { 13 | "@types/react": "19.1.14", 14 | "@types/react-dom": "19.1.9" 15 | }, 16 | "overrides": { 17 | "react": "^19.1.0", 18 | "react-dom": "^19.1.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableMaxResults.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTableMaxResults = () => { 5 | return ( 6 | <> 7 |

8 | The maxResults prop can be used to limit the number of records 9 | displayed. 10 |

11 |
12 | 13 |
14 | 15 | ); 16 | }; 17 | 18 | export default DataTableMaxResults; 19 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/Setting.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | using Xams.Core.Attributes; 4 | 5 | namespace Xams.Core.Entities; 6 | 7 | [Table(nameof(Setting))] 8 | public class Setting 9 | { 10 | public Guid SettingId { get; set; } 11 | [UIRequired] 12 | [MaxLength(250)] 13 | public string? Name { get; set; } 14 | [MaxLength(2000)] 15 | public string? Value { get; set; } 16 | 17 | public int Discriminator { get; set; } 18 | } -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableFields.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTableFields = () => { 5 | return ( 6 | <> 7 |

8 | You can specify the DataTable fields and their ordering by using the 9 | fields prop. 10 |

11 |
12 | 13 |
14 | 15 | ); 16 | }; 17 | 18 | export default DataTableFields; 19 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UIHideAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes 2 | { 3 | public class UIHideAttribute : Attribute 4 | { 5 | public bool Queryable { get; set; } 6 | /// 7 | /// Field cannot be read from the UI. 8 | /// 9 | /// If true, this field can still be used as a filter from the UI. 10 | public UIHideAttribute(bool queryable = false) 11 | { 12 | Queryable = queryable; 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UISetFieldFromLookupAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes 2 | { 3 | /// 4 | /// Sets a string field on the entity to the lookupname value of a related entity 5 | /// 6 | public class UISetFieldFromLookupAttribute : Attribute 7 | { 8 | public string LookupIdProperty { get; set; } 9 | 10 | public UISetFieldFromLookupAttribute(string lookupIdProperty) 11 | { 12 | LookupIdProperty = lookupIdProperty; 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/User.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace Xams.Core.Entities; 5 | 6 | [Table("User")] 7 | public class User 8 | { 9 | public Guid UserId { get; set; } 10 | [MaxLength(100)] 11 | public string? Name { get; set; } 12 | public DateTime CreatedDate { get; set; } 13 | 14 | public int Discriminator { get; set; } 15 | 16 | // public ICollection> UserRoles { get; set; } = null!; 17 | } -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DTFormZIndex.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DTFormZIndex = () => { 5 | return ( 6 | <> 7 |

8 | You might need to adjust the formZIndex prop if the form is not 9 | appearing above other elements on the page. 10 |

11 |
12 | 13 |
14 | 15 | ); 16 | }; 17 | 18 | export default DTFormZIndex; 19 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableDisabled.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTableDisabled = () => { 5 | return ( 6 | <> 7 |

The DataTable can be disabled by setting the disabledMessage prop.

8 |
9 | 13 |
14 | 15 | ); 16 | }; 17 | 18 | export default DataTableDisabled; 19 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/components/datatable/DataTableContext.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { DataTableShape } from "./DataTableTypes"; 3 | 4 | export const DataTableContext = React.createContext( 5 | null 6 | ); 7 | 8 | export const useDataTableContext = () => { 9 | const context = React.useContext(DataTableContext); 10 | if (context == null) { 11 | throw new Error( 12 | "useDataTableContext must be used within a DataTableContextProvider" 13 | ); 14 | } 15 | return context; 16 | }; 17 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Pipeline/SystemParameters.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Pipeline; 2 | 3 | public struct SystemParameters 4 | { 5 | public bool ReturnEmpty { get; set; } // True if Create \ Update \ Upsert should return empty response and not retrieve entity 6 | public bool ReturnEntity { get; set; } // True if Create \ Update \ Upsert should return c# class entity vs dynamic object 7 | public bool NoPostOrderTraversalDelete { get; set; } // True to prevent post order traversal delete 8 | public bool PreventSave { get; set; } // True to prevent save 9 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/MagnifyingGlassIcon.tsx: -------------------------------------------------------------------------------- 1 | export function MagnifyingGlassIcon( 2 | props: React.ComponentPropsWithoutRef<'svg'>, 3 | ) { 4 | return ( 5 | 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/ServiceStartupAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | [Flags] 4 | public enum StartupOperation 5 | { 6 | Pre = 1, 7 | Post = 2 8 | } 9 | 10 | public class ServiceStartupAttribute : Attribute 11 | { 12 | public StartupOperation StartupOperation { get; private set; } 13 | public int Order { get; private set; } 14 | public ServiceStartupAttribute(StartupOperation startupOperation, int order = 0) 15 | { 16 | StartupOperation = startupOperation; 17 | Order = order; 18 | } 19 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Contexts/ActionServiceContext.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Http; 2 | using Xams.Core.Attributes; 3 | using Xams.Core.Base; 4 | using Xams.Core.Pipeline; 5 | 6 | namespace Xams.Core.Contexts; 7 | 8 | public class ActionServiceContext : BaseServiceContext 9 | { 10 | public DataOperation DataOperation { get => DataOperation.Action; } 11 | public IFormFile? File { get => PipelineContext.File; } 12 | 13 | public ActionServiceContext(PipelineContext pipelineContext) : base(pipelineContext) 14 | { 15 | 16 | } 17 | } -------------------------------------------------------------------------------- /xams-mcp-server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "Node16", 5 | "moduleResolution": "Node16", 6 | "outDir": "./build", 7 | "rootDir": "./src", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "skipLibCheck": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "resolveJsonModule": true, 13 | "declaration": true, 14 | "declarationMap": true, 15 | "sourceMap": true 16 | }, 17 | "include": ["src/**/*"], 18 | "exclude": ["node_modules", "build"] 19 | } 20 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DTFormFields.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DTFormFields = () => { 5 | return ( 6 | <> 7 |

8 | The fields displayed in the DataTable form can be customized by passing 9 | an array of field names to the formFields prop. 10 |

11 |
12 | 13 |
14 | 15 | ); 16 | }; 17 | 18 | export default DTFormFields; 19 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DTFormTitle.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DTFormTitle = () => { 5 | return ( 6 | <> 7 |

8 | The formTitle prop can be used to customize the title of the form that 9 | opens when clicking the Add button or on a row. 10 |

11 |
12 | 13 |
14 | 15 | ); 16 | }; 17 | 18 | export default DTFormTitle; 19 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableConfirmDelete.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTableConfirmDelete = () => { 5 | return ( 6 | <> 7 |

8 | The delete confirmation message can be disabled by setting the 9 | confirmDelete prop to false. 10 |

11 |
12 | 13 |
14 | 15 | ); 16 | }; 17 | 18 | export default DataTableConfirmDelete; 19 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableSearchable.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTableSearchable = () => { 5 | return ( 6 | <> 7 |

8 | Search can be disabled by setting the searchable prop to false. The 9 | search bar will not be displayed. 10 |

11 |
12 | 13 |
14 | 15 | ); 16 | }; 17 | 18 | export default DataTableSearchable; 19 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env*.local 29 | 30 | # vercel 31 | .vercel 32 | 33 | # typescript 34 | *.tsbuildinfo 35 | next-env.d.ts 36 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Interfaces/IServicePermission.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Contexts; 2 | using Xams.Core.Dtos; 3 | 4 | namespace Xams.Core.Interfaces; 5 | 6 | /// 7 | /// Service Permissions return a list of permissions that should exist in the system. 8 | /// If the permissions do not exist, the system will create them, and the permission 9 | /// existed prior but no longer does, the system will remove it. 10 | /// 11 | public interface IServicePermission 12 | { 13 | public Task>> Execute(PermissionContext permissionContext); 14 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/CheckIcon.tsx: -------------------------------------------------------------------------------- 1 | export function CheckIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/Migrations/20240609204023_migration02.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore.Migrations; 2 | 3 | #nullable disable 4 | 5 | namespace MyXProject.Data.Migrations 6 | { 7 | /// 8 | public partial class migration02 : Migration 9 | { 10 | /// 11 | protected override void Up(MigrationBuilder migrationBuilder) 12 | { 13 | 14 | } 15 | 16 | /// 17 | protected override void Down(MigrationBuilder migrationBuilder) 18 | { 19 | 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/Migrations/20240609204055_migration03.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore.Migrations; 2 | 3 | #nullable disable 4 | 5 | namespace MyXProject.Data.Migrations 6 | { 7 | /// 8 | public partial class migration03 : Migration 9 | { 10 | /// 11 | protected override void Up(MigrationBuilder migrationBuilder) 12 | { 13 | 14 | } 15 | 16 | /// 17 | protected override void Down(MigrationBuilder migrationBuilder) 18 | { 19 | 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/Migrations/20250208022646_migration07.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore.Migrations; 2 | 3 | #nullable disable 4 | 5 | namespace MyXProject.Data.Migrations 6 | { 7 | /// 8 | public partial class migration07 : Migration 9 | { 10 | /// 11 | protected override void Up(MigrationBuilder migrationBuilder) 12 | { 13 | 14 | } 15 | 16 | /// 17 | protected override void Down(MigrationBuilder migrationBuilder) 18 | { 19 | 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Pipeline/Stages/PipeEntityCreate.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Base; 2 | using Xams.Core.Dtos; 3 | 4 | namespace Xams.Core.Pipeline.Stages; 5 | 6 | public class PipeEntityCreate : BasePipelineStage 7 | { 8 | public override async Task> Execute(PipelineContext context) 9 | { 10 | var response = await context.DataRepository.Create(context.Entity, context.SystemParameters.PreventSave); 11 | if (!response.Succeeded) 12 | { 13 | return response; 14 | } 15 | return await base.Execute(context); 16 | } 17 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Pipeline/Stages/PipeEntityUpdate.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Base; 2 | using Xams.Core.Dtos; 3 | 4 | namespace Xams.Core.Pipeline.Stages; 5 | 6 | public class PipeEntityUpdate : BasePipelineStage 7 | { 8 | public override async Task> Execute(PipelineContext context) 9 | { 10 | var response = await context.DataRepository.Update(context.Entity, context.SystemParameters.PreventSave); 11 | if (!response.Succeeded) 12 | { 13 | return response; 14 | } 15 | return await base.Execute(context); 16 | } 17 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/BookIcon.tsx: -------------------------------------------------------------------------------- 1 | export function BookIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/System.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | using Microsoft.EntityFrameworkCore; 4 | 5 | namespace Xams.Core.Entities; 6 | 7 | [Table(nameof(System))] 8 | [Index(nameof(Name), nameof(DateTime), Name = "IX_System_Name_DateTime")] 9 | public class System 10 | { 11 | public Guid SystemId { get; set; } 12 | [MaxLength(250)] 13 | public string? Name { get; set; } 14 | [MaxLength(2000)] 15 | public string? Value { get; set; } 16 | public DateTime? DateTime { get; set; } 17 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/DocumentIcon.tsx: -------------------------------------------------------------------------------- 1 | export function DocumentIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DTFormHideSaveButton.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DTFormHideSaveButton = () => { 5 | return ( 6 | <> 7 |

8 | The formHideSaveButton prop can be used to hide the save button on the 9 | form that opens when clicking the Add button or on a row. 10 |

11 |
12 | 13 |
14 | 15 | ); 16 | }; 17 | 18 | export default DTFormHideSaveButton; 19 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "declarationDir": "./dist/types", 5 | "emitDeclarationOnly": true, 6 | "module": "ESNext", 7 | "target": "ES2021", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "jsx": "react", 11 | "moduleResolution": "bundler", 12 | "sourceMap": true, 13 | "allowSyntheticDefaultImports": true, 14 | "skipLibCheck": true, 15 | "forceConsistentCasingInFileNames": true 16 | }, 17 | "include": ["src/**/*"], 18 | "exclude": ["node_modules", "dist"] 19 | } 20 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/app/react_field/page.mdx: -------------------------------------------------------------------------------- 1 | export const metadata = { 2 | title: 'Performance', 3 | description: 'How to maximize performance in Xams', 4 | } 5 | 6 | # Entities 7 | 8 | Entity definitions need to follow certain rules in order to work with Xams. {{ className: 'lead' }} 9 | 10 | ## Release Mode 11 | 12 | Building in release mode can dramatically increase performance. 13 | 14 | ## Batches 15 | 16 | Sending data in batches can increase performance. 17 | 18 | Entities with no service logic will hault saving until they've all been added to the change tracker. 19 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/PaperAirplaneIcon.tsx: -------------------------------------------------------------------------------- 1 | export function PaperAirplaneIcon( 2 | props: React.ComponentPropsWithoutRef<'svg'>, 3 | ) { 4 | return ( 5 | 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "declarationDir": "./dist/types", 5 | "emitDeclarationOnly": true, 6 | "module": "ESNext", 7 | "target": "ES2021", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "jsx": "react", 11 | "moduleResolution": "node", 12 | "sourceMap": true, 13 | "allowSyntheticDefaultImports": true, 14 | "skipLibCheck": true, 15 | "forceConsistentCasingInFileNames": true 16 | }, 17 | "include": ["src/**/*"], 18 | "exclude": ["node_modules", "dist"] 19 | } 20 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-firebase/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "declarationDir": "./dist/types", 5 | "emitDeclarationOnly": true, 6 | "module": "ESNext", 7 | "target": "ES2021", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "jsx": "react", 11 | "moduleResolution": "node", 12 | "sourceMap": true, 13 | "allowSyntheticDefaultImports": true, 14 | "skipLibCheck": true, 15 | "forceConsistentCasingInFileNames": true 16 | }, 17 | "include": ["src/**/*"], 18 | "exclude": ["node_modules", "dist"] 19 | } 20 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Services/Auditing/AuditFieldService.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Attributes; 2 | using Xams.Core.Contexts; 3 | using Xams.Core.Dtos; 4 | using Xams.Core.Interfaces; 5 | using Xams.Core.Utils; 6 | 7 | namespace Xams.Core.Services.Auditing; 8 | 9 | [ServiceLogic("AuditField", DataOperation.Delete, LogicStage.PreOperation)] 10 | public class AuditFieldService : IServiceLogic 11 | { 12 | public Task> Execute(ServiceContext context) 13 | { 14 | return Task.FromResult(ServiceResult.Error("AuditField records are managed by the system and cannot be deleted")); 15 | } 16 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/FaceSmileIcon.tsx: -------------------------------------------------------------------------------- 1 | export function FaceSmileIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/ListIcon.tsx: -------------------------------------------------------------------------------- 1 | export function ListIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-firebase/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "declarationDir": "./dist/types", 5 | "emitDeclarationOnly": true, 6 | "module": "ESNext", 7 | "target": "ES2021", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "jsx": "react", 11 | "moduleResolution": "node", 12 | "sourceMap": true, 13 | "allowSyntheticDefaultImports": true, 14 | "skipLibCheck": true, 15 | "forceConsistentCasingInFileNames": true 16 | }, 17 | "include": ["src/**/*"], 18 | "exclude": ["node_modules", "dist"] 19 | } 20 | -------------------------------------------------------------------------------- /core/xams-workspace/headless-auth-react-supabase/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "declarationDir": "./dist/types", 5 | "emitDeclarationOnly": true, 6 | "module": "ESNext", 7 | "target": "ES2021", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "jsx": "react", 11 | "moduleResolution": "node", 12 | "sourceMap": true, 13 | "allowSyntheticDefaultImports": true, 14 | "skipLibCheck": true, 15 | "forceConsistentCasingInFileNames": true 16 | }, 17 | "include": ["src/**/*"], 18 | "exclude": ["node_modules", "dist"] 19 | } 20 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/utils/PermissionUtil.tsx: -------------------------------------------------------------------------------- 1 | import { PermissionLevel } from "../stores/usePermissionStore"; 2 | 3 | export const PermissionUtil = { 4 | getHighestPermissionLevel: (permissions: string[]): PermissionLevel => { 5 | if (permissions.find((p) => p.endsWith("_SYSTEM")) !== undefined) { 6 | return "SYSTEM"; 7 | } 8 | if (permissions.find((p) => p.endsWith("_TEAM")) !== undefined) { 9 | return "TEAM"; 10 | } 11 | if (permissions.find((p) => p.endsWith("_USER")) !== undefined) { 12 | return "USER"; 13 | } 14 | return "NONE"; 15 | }, 16 | }; 17 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/logos/ruby.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableColumnWidths.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTableColumnWidths = () => { 5 | return ( 6 | <> 7 |

8 | Column widths can be set using the columnWidths prop. The first column 9 | width is set to 100px and the second column width is set to 100%. 10 |

11 |
12 | 13 |
14 | 15 | ); 16 | }; 17 | 18 | export default DataTableColumnWidths; 19 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTables.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTables = () => { 5 | return ( 6 | <> 7 |

8 | The DataTable component allows for the display of data in a table 9 | format. New records can be created by clicking the + button. The 10 | DataTable supports searching, paging, deletion, and creation. 11 |

12 |
13 | 14 |
15 | 16 | ); 17 | }; 18 | 19 | export default DataTables; 20 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/PaperClipIcon.tsx: -------------------------------------------------------------------------------- 1 | export function PaperClipIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Config/FirebaseConfig.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Config; 2 | 3 | public class FirebaseConfig 4 | { 5 | public required string apiKey { get; set; } 6 | public required string authDomain { get; set; } 7 | public required string projectId { get; set; } 8 | public required string storageBucket { get; set; } 9 | public required string messagingSenderId { get; set; } 10 | public required string appId { get; set; } 11 | public required string measurementId { get; set; } 12 | public required string[] providers { get; set; } = []; 13 | public bool enableSmsMfa { get; set; } = false; 14 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Pipeline/Stages/PipeAddEntityToEntities.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Base; 2 | using Xams.Core.Dtos; 3 | 4 | namespace Xams.Core.Pipeline.Stages; 5 | 6 | public class PipeAddEntityToEntities : BasePipelineStage 7 | { 8 | public override async Task> Execute(PipelineContext context) 9 | { 10 | context.Entities = new List(); 11 | // Handle Create\Update\Delete entity for service logic 12 | if (context.Entity != null) 13 | { 14 | context.Entities.Add(context.Entity); 15 | } 16 | return await base.Execute(context); 17 | } 18 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UIDisplayNameAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes 2 | { 3 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = true)] 4 | public class UIDisplayNameAttribute : Attribute 5 | { 6 | public string Name { get; set; } 7 | public string Field { get; set; } 8 | public string Tag { get; set; } 9 | 10 | public UIDisplayNameAttribute(string name, string field = "", string tag = "") 11 | { 12 | this.Name = name; 13 | this.Field = field; 14 | this.Tag = tag; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Jobs/JobOptions.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace Xams.Core.Jobs; 3 | 4 | public class JobOptions 5 | { 6 | public required string JobName { get; set; } 7 | 8 | /// 9 | /// Optionally specify Job Server 10 | /// 11 | public string? JobServer { get; set; } 12 | 13 | /// 14 | /// Any class or anonymous type 15 | /// 16 | public object? Parameters { get; set; } 17 | 18 | /// 19 | /// Force set the JobHistoryId. Useful for monitoring a job status. 20 | /// 21 | public Guid? JobHistoryId { get; set; } 22 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/PackageIcon.tsx: -------------------------------------------------------------------------------- 1 | export function PackageIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from 'tailwindcss' 2 | 3 | const config: Config = { 4 | content: [ 5 | './src/pages/**/*.{js,ts,jsx,tsx,mdx}', 6 | './src/components/**/*.{js,ts,jsx,tsx,mdx}', 7 | './src/app/**/*.{js,ts,jsx,tsx,mdx}', 8 | ], 9 | theme: { 10 | extend: { 11 | backgroundImage: { 12 | 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', 13 | 'gradient-conic': 14 | 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', 15 | }, 16 | }, 17 | }, 18 | plugins: [], 19 | } 20 | export default config 21 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableScrollable.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTableScrollable = () => { 5 | return ( 6 | <> 7 |

8 | If the scrollable prop is set to false, the DataTable will not be 9 | scrollable. The height of the DataTable will be determined by the number 10 | of records displayed. 11 |

12 |
13 | 14 |
15 | 16 | ); 17 | }; 18 | 19 | export default DataTableScrollable; 20 | -------------------------------------------------------------------------------- /core/xams/Xams.Firebase/Xams.Firebase.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net8.0 5 | enable 6 | enable 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | output: "export", 4 | basePath: "/x", 5 | images: { 6 | unoptimized: true, 7 | }, 8 | trailingSlash: false, 9 | reactStrictMode: true, 10 | transpilePackages: [ 11 | "@ixeta/xams", 12 | "@ixeta/headless-auth-react", 13 | "@ixeta/headless-auth-react-firebase", 14 | ], 15 | }; 16 | 17 | const withBundleAnalyzer = require("@next/bundle-analyzer")({ 18 | enabled: process.env.ANALYZE === "true", 19 | }); 20 | module.exports = withBundleAnalyzer(nextConfig); 21 | 22 | // module.exports = nextConfig 23 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/components/datagrid/SubGridContext.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export interface SubGridContextProps { 4 | children?: any; 5 | } 6 | 7 | export type SubGridContextShape = { 8 | skipRows: number; 9 | skipColumns: number; 10 | }; 11 | 12 | export const GridSubContext = React.createContext( 13 | null 14 | ); 15 | 16 | export const useSubGridContext = () => { 17 | const context = React.useContext(GridSubContext); 18 | if (!context) { 19 | throw new Error("useSubGrid must be used within a SubGridContextProvider"); 20 | } 21 | return context; 22 | }; 23 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Contexts/BulkServiceContext.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Base; 2 | using Xams.Core.Interfaces; 3 | using Xams.Core.Pipeline; 4 | 5 | namespace Xams.Core.Contexts; 6 | 7 | public class BulkServiceContext : BaseServiceContext 8 | { 9 | // Every ServiceContext that was created during the transaction 10 | // ie: Child ServiceContexts 11 | public List AllServiceContexts { get; private set; } 12 | 13 | public BulkServiceContext(PipelineContext pipelineContext, List allServiceContexts) : base(pipelineContext) 14 | { 15 | AllServiceContexts = allServiceContexts; 16 | } 17 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/next.config.mjs: -------------------------------------------------------------------------------- 1 | import nextMDX from '@next/mdx' 2 | 3 | import { recmaPlugins } from './src/mdx/recma.mjs' 4 | import { rehypePlugins } from './src/mdx/rehype.mjs' 5 | import { remarkPlugins } from './src/mdx/remark.mjs' 6 | import withSearch from './src/mdx/search.mjs' 7 | 8 | const withMDX = nextMDX({ 9 | options: { 10 | remarkPlugins, 11 | rehypePlugins, 12 | recmaPlugins, 13 | }, 14 | }) 15 | 16 | /** @type {import('next').NextConfig} */ 17 | const nextConfig = { 18 | pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'mdx'], 19 | } 20 | 21 | export default withSearch(withMDX(nextConfig)) 22 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/CopyIcon.tsx: -------------------------------------------------------------------------------- 1 | export function CopyIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "paths": { 17 | "@/*": ["./src/*"] 18 | } 19 | }, 20 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 21 | "exclude": ["node_modules"] 22 | } 23 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/apiurls.tsx: -------------------------------------------------------------------------------- 1 | export const API_DATA_WHOAMI = `/xams/WhoAmI`; 2 | export const API_DATA_PERMISSIONS = `/xams/Permissions`; 3 | export const API_DATA_METADATA = `/xams/MetaData`; 4 | export const API_DATA_CREATE = `/xams/Create`; 5 | export const API_DATA_READ = `/xams/Read`; 6 | export const API_DATA_UPDATE = `/xams/Update`; 7 | export const API_DATA_DELETE = `/xams/Delete`; 8 | export const API_DATA_UPSERT = `/xams/Upsert`; 9 | export const API_DATA_BULK = `/xams/Bulk`; 10 | export const API_DATA_ACTION = `/xams/Action`; 11 | export const API_DATA_FILE = `/xams/File`; 12 | export const API_CONFIG = `/xams/Config`; 13 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "paths": { 17 | "@/*": ["./src/*"] 18 | } 19 | }, 20 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 21 | "exclude": ["node_modules"] 22 | } 23 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/apiurls.tsx: -------------------------------------------------------------------------------- 1 | export const API_DATA_WHOAMI = `/xams/WhoAmI`; 2 | export const API_DATA_PERMISSIONS = `/xams/Permissions`; 3 | export const API_DATA_METADATA = `/xams/MetaData`; 4 | export const API_DATA_CREATE = `/xams/Create`; 5 | export const API_DATA_READ = `/xams/Read`; 6 | export const API_DATA_UPDATE = `/xams/Update`; 7 | export const API_DATA_DELETE = `/xams/Delete`; 8 | export const API_DATA_UPSERT = `/xams/Upsert`; 9 | export const API_DATA_BULK = `/xams/Bulk`; 10 | export const API_DATA_ACTION = `/xams/Action`; 11 | export const API_DATA_FILE = `/xams/File`; 12 | export const API_CONFIG = `/xams/Config`; 13 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/hooks/useColor.tsx: -------------------------------------------------------------------------------- 1 | import { useMantineColorScheme, useMantineTheme } from "@mantine/core"; 2 | import React from "react"; 3 | 4 | const useColor = () => { 5 | const theme = useMantineTheme(); 6 | const { colorScheme, toggleColorScheme } = useMantineColorScheme(); 7 | const dark = colorScheme === "dark"; 8 | const color = dark ? theme.colors.gray[4] : theme.colors.dark[7]; 9 | return { 10 | getIconColor: () => color, 11 | getPrimaryColor: () => theme.colors[theme.primaryColor][dark ? 8 : 6], 12 | colorScheme: colorScheme as "light" | "dark", 13 | }; 14 | }; 15 | 16 | export default useColor; 17 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/wwwroot/xams/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/admin-dash/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Services/Logic/SystemService.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Attributes; 2 | using Xams.Core.Contexts; 3 | using Xams.Core.Dtos; 4 | using Xams.Core.Interfaces; 5 | using Xams.Core.Utils; 6 | using static Xams.Core.Attributes.DataOperation; 7 | using static Xams.Core.Attributes.LogicStage; 8 | 9 | namespace Xams.Core.Services.Logic; 10 | 11 | [ServiceLogic("System", Create | Update | Delete, PreOperation)] 12 | public class SystemService : IServiceLogic 13 | { 14 | public Task> Execute(ServiceContext context) 15 | { 16 | return Task.FromResult(ServiceResult.Error("System records cannot be modified.")); 17 | } 18 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/ChevronRightLeftIcon.tsx: -------------------------------------------------------------------------------- 1 | export function ChevronRightLeftIcon( 2 | props: React.ComponentPropsWithoutRef<'svg'>, 3 | ) { 4 | return ( 5 | 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "declarationDir": "./dist/types", 5 | "emitDeclarationOnly": true, 6 | "module": "ESNext", 7 | "target": "ES2021", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "jsx": "react-jsx", 11 | "moduleResolution": "bundler", 12 | "sourceMap": true, 13 | "allowSyntheticDefaultImports": true, 14 | "skipLibCheck": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "lib": ["ES2021", "DOM", "DOM.Iterable"] 17 | }, 18 | "include": ["src/**/*"], 19 | "exclude": ["node_modules", "dist"] 20 | } 21 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/admin/types/RolePermissionTypes.ts: -------------------------------------------------------------------------------- 1 | import { Permission } from "../../api/Permission"; 2 | import { RolePermission } from "../../api/RolePermission"; 3 | import { TablesResponse } from "../../api/TablesResponse"; 4 | 5 | export type RolePermissionState = { 6 | tables: TablesResponse[]; 7 | allPermissions: Permission[]; 8 | rolePermissions: RolePermission[]; 9 | createRolePermissions: RolePermission[]; 10 | updateRolePermissions: RolePermission[]; 11 | deleteRolePermissions: RolePermission[]; 12 | isLoaded: boolean; 13 | }; 14 | 15 | export const SystemAdministratorRoleId = "64589861-0481-4dbb-a96f-9b8b6546c40d"; 16 | -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/ConfigData.cs: -------------------------------------------------------------------------------- 1 | namespace MyXProject.Data; 2 | 3 | public static class ConfigData 4 | { 5 | private static ConfigRecords? _configRecords; 6 | 7 | public static ConfigRecords Get() 8 | { 9 | if (_configRecords != null) 10 | { 11 | return _configRecords; 12 | } 13 | 14 | using (DataContext db = new DataContext()) 15 | { 16 | _configRecords = new ConfigRecords() 17 | { 18 | 19 | }; 20 | } 21 | 22 | 23 | return _configRecords; 24 | } 25 | 26 | public class ConfigRecords 27 | { 28 | 29 | } 30 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/EnvelopeIcon.tsx: -------------------------------------------------------------------------------- 1 | export function EnvelopeIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/app/claude/page.mdx: -------------------------------------------------------------------------------- 1 | export const metadata = { 2 | title: 'Claude Code', 3 | description: 'Using the Xams MCP Server with Claude Code', 4 | } 5 | 6 | # Claude Code 7 | 8 | The Xams MCP Server provides all Xams Framework documentation to Claude Code via the Model Context Protocol. 9 | 10 | ## Setup 11 | 12 | Add the Xams MCP Server to your Claude Code configuration: 13 | 14 | ```bash 15 | claude mcp add --transport http xams https://mcp.xams.io 16 | ``` 17 | 18 | Once configured, Claude Code will have access to all Xams documentation via MCP URIs like `xams://docs/quickstart`, `xams://docs/entities`, `xams://ref/core-essentials`, etc. 19 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/BellIcon.tsx: -------------------------------------------------------------------------------- 1 | export function BellIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config: Config = { 4 | content: [ 5 | "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", 6 | "./src/components/**/*.{js,ts,jsx,tsx,mdx}", 7 | "./src/app/**/*.{js,ts,jsx,tsx,mdx}", 8 | "./src/**/*.{js,ts,jsx,tsx,mdx}", 9 | ], 10 | theme: { 11 | extend: { 12 | backgroundImage: { 13 | "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", 14 | "gradient-conic": 15 | "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", 16 | }, 17 | }, 18 | }, 19 | plugins: [], 20 | }; 21 | export default config; 22 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/CartIcon.tsx: -------------------------------------------------------------------------------- 1 | export function CartIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/ChatBubbleIcon.tsx: -------------------------------------------------------------------------------- 1 | export function ChatBubbleIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Contexts/PermissionContext.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Base; 2 | using Xams.Core.Interfaces; 3 | 4 | namespace Xams.Core.Contexts; 5 | 6 | public class PermissionContext 7 | { 8 | private IDataService DataService { get; set; } 9 | public PermissionContext(IDataService dataService) 10 | { 11 | DataService = dataService; 12 | } 13 | 14 | public T GetDbContext() where T : IXamsDbContext 15 | { 16 | return DataService.GetDataRepository().GetDbContext(); 17 | } 18 | 19 | public T CreateNewDbContext() where T : IXamsDbContext 20 | { 21 | return DataService.GetDataRepository().CreateNewDbContext(); 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableOrder.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTableOrder = () => { 5 | return ( 6 | <> 7 |

8 | The data can be sorted by clicking on the column headers. The default 9 | order can be set using the `orderBy` prop. 10 |

11 |
12 | 21 |
22 | 23 | ); 24 | }; 25 | 26 | export default DataTableOrder; 27 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/ShapesIcon.tsx: -------------------------------------------------------------------------------- 1 | export function ShapesIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Services/Auditing/AuditHistoryDetailService.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Attributes; 2 | using Xams.Core.Contexts; 3 | using Xams.Core.Dtos; 4 | using Xams.Core.Entities; 5 | using Xams.Core.Interfaces; 6 | using Xams.Core.Utils; 7 | using static Xams.Core.Attributes.DataOperation; 8 | 9 | namespace Xams.Core.Services.Auditing; 10 | 11 | [ServiceLogic(nameof(AuditHistoryDetail), Create | Update | Delete, LogicStage.PreOperation, Int32.MinValue)] 12 | public class AuditHistoryDetailService : IServiceLogic 13 | { 14 | public Task> Execute(ServiceContext context) 15 | { 16 | return Task.FromResult(ServiceResult.Error("Cannot Create, Update or Delete Audit History Details")); 17 | } 18 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/Option.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | using Xams.Core.Attributes; 4 | 5 | namespace Xams.Core.Entities; 6 | 7 | [Table(nameof(Option))] 8 | public class Option 9 | { 10 | public Guid OptionId { get; set; } 11 | [UIName] 12 | [MaxLength(250)] 13 | public string? Label { get; set; } 14 | 15 | [UIDisplayName("Option Name")] 16 | [MaxLength(250)] 17 | public string? Name { get; set; } 18 | 19 | [MaxLength(250)] 20 | public string? Value { get; set; } 21 | 22 | public int? Order { get; set; } 23 | 24 | [UIHide] 25 | [MaxLength(250)] 26 | public string? Tag { get; set; } 27 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Dtos/Data/ReadOutput.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Dtos.Data 2 | { 3 | public class ReadOutput 4 | { 5 | public int pages { get; set; } 6 | public int currentPage { get; set; } 7 | public int totalResults { get; set; } 8 | public int maxResults { get; set; } 9 | public string tableName { get; set; } 10 | public OrderBy[]? orderBy { get; set; } 11 | public bool? distinct { get; set; } 12 | public bool? denormalize { get; set; } 13 | // public string? order { get; set; } 14 | // public string? orderBy { get; set; } 15 | public List results { get; set; } 16 | public dynamic parameters { get; set; } = null!; 17 | } 18 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Base/BasePipelineStage.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Dtos; 2 | using Xams.Core.Interfaces; 3 | using Xams.Core.Pipeline; 4 | 5 | namespace Xams.Core.Base; 6 | 7 | 8 | public class BasePipelineStage : IPipelineStage 9 | { 10 | protected IPipelineStage? _next; 11 | 12 | public void SetNext(IPipelineStage nextItem) 13 | { 14 | _next = nextItem; 15 | } 16 | 17 | public virtual async Task> Execute(PipelineContext context) 18 | { 19 | if (_next != null) 20 | { 21 | var response = await _next.Execute(context); 22 | return response; 23 | } 24 | 25 | return new Response { Succeeded = true }; 26 | } 27 | } 28 | 29 | 30 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DTFormDefaults.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DTFormDefaults = () => { 5 | return ( 6 | <> 7 |

8 | The formFieldDefaults prop can be used to set default values for the 9 | form fields on create. This works even if the fields are hidden. 10 |

11 |
12 | 21 |
22 | 23 | ); 24 | }; 25 | 26 | export default DTFormDefaults; 27 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/app/performance/page.mdx: -------------------------------------------------------------------------------- 1 | export const metadata = { 2 | title: 'Performance', 3 | description: 'How to maximize performance in Xams', 4 | } 5 | 6 | # Entities 7 | 8 | Entity definitions need to follow certain rules in order to work with Xams. {{ className: 'lead' }} 9 | 10 | ## Release Mode 11 | 12 | Building in release mode can dramatically increase performance. 13 | 14 | ## Batches 15 | 16 | Sending data in batches can increase performance. 17 | 18 | Entities with no service logic will hault saving until they've all been added to the change tracker. 19 | 20 | ## Service logic 21 | 22 | Favor PreValidation and PreOperation service logic whenever possible. This reduces the amount of calls to the database. 23 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/AuditField.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | using Xams.Core.Attributes; 4 | 5 | namespace Xams.Core.Entities; 6 | 7 | [Table(nameof(AuditField))] 8 | public class AuditField 9 | { 10 | public Guid AuditFieldId { get; set; } 11 | [UIDisplayName("Field Name")] 12 | [MaxLength(250)] 13 | public string? Name { get; set; } 14 | public Guid AuditId { get; set; } 15 | public Audit? Audit { get; set; } 16 | [UIDisplayName("Create")] 17 | public bool IsCreate { get; set; } 18 | [UIDisplayName("Update")] 19 | public bool IsUpdate { get; set; } 20 | [UIDisplayName("Delete")] 21 | public bool IsDelete { get; set; } 22 | } -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableCreateButton.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import { Button } from "@mantine/core"; 3 | import React from "react"; 4 | 5 | const DataTableCreateButton = () => { 6 | return ( 7 | <> 8 |

9 | The customCreateButton prop can be used to customize the create button 10 | that opens the form to create a new record. 11 |

12 |
13 | { 16 | return ; 17 | }} 18 | /> 19 |
20 | 21 | ); 22 | }; 23 | 24 | export default DataTableCreateButton; 25 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/SquaresPlusIcon.tsx: -------------------------------------------------------------------------------- 1 | export function SquaresPlusIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/dbupdate.sh: -------------------------------------------------------------------------------- 1 | # dotnet tool install --global dotnet-ef 2 | # dotnet add package Microsoft.EntityFrameworkCore.Design 3 | dotnet ef migrations add $2 4 | dotnet ef database update --connection $1 5 | 6 | # Step 1: Start Docker 7 | # docker run --name myxproject -p 6001:5432 -e POSTGRES_PASSWORD=pgpass -e POSTGRES_USER=pgadmin -d postgres 8 | 9 | # Step 2.a: Make Bash file executable 10 | # chmod +x dbupdate.sh 11 | 12 | # Step 2.b: Migrate and update 13 | # ./dbupdate.sh "Host=localhost:6001;Database=myxproject;Username=pgadmin;Password=pgpass;ApplicationName=myxproject" migration 14 | 15 | # Dev, Update 16 | # dotnet ef database update --connection 'Host=localhost:6001;Database=myxproject;Username=postgres;Password=pgpass;ApplicationName=myxproject' -------------------------------------------------------------------------------- /xams-mcp-server/src/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Represents an MCP resource that can be served 3 | */ 4 | export interface XamsResource { 5 | /** MCP URI (e.g., "xams://docs/quickstart") */ 6 | uri: string; 7 | /** Human-readable name */ 8 | name: string; 9 | /** Description of the resource */ 10 | description: string; 11 | /** MIME type */ 12 | mimeType: string; 13 | /** Absolute file path */ 14 | filePath: string; 15 | } 16 | 17 | /** 18 | * Resource category for organization 19 | */ 20 | export enum ResourceCategory { 21 | Docs = "docs", 22 | Ref = "ref", 23 | Guides = "guides", 24 | } 25 | 26 | /** 27 | * Result of resource discovery 28 | */ 29 | export interface DiscoveryResult { 30 | resources: XamsResource[]; 31 | errors: string[]; 32 | } 33 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Utils/GuidUtil.cs: -------------------------------------------------------------------------------- 1 | using System.Security.Cryptography; 2 | using System.Text; 3 | 4 | namespace Xams.Core.Utils 5 | { 6 | public class GuidUtil 7 | { 8 | public static Guid FromString(string input) 9 | { 10 | using (SHA256 sha256 = SHA256.Create()) 11 | { 12 | byte[] inputBytes = Encoding.UTF8.GetBytes(input); 13 | byte[] hashedBytes = sha256.ComputeHash(inputBytes); 14 | 15 | // Truncate the hash to 16 bytes to fit the size of a Guid. 16 | byte[] truncatedBytes = new byte[16]; 17 | Array.Copy(hashedBytes, truncatedBytes, 16); 18 | 19 | return new Guid(truncatedBytes); 20 | } 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/ClipboardIcon.tsx: -------------------------------------------------------------------------------- 1 | export function ClipboardIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/MapPinIcon.tsx: -------------------------------------------------------------------------------- 1 | export function MapPinIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/yes.pub: -------------------------------------------------------------------------------- 1 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDILeyg8LcjidAm9miJE3kTp4HRbqs6Cejxn0PKAWWeqd+Fs5ZFGv21OtYyJcXNutRj2/GoAL26TSZ6LME35KKcFHM61nsYpevz/n1QQFni42iB7aN+MCxOZKgUy2VNyiSze0SxbRDURAx76eRekuLMBphmFX6cmBssInVvBdca6RnZUFT/8PBwjkQutyfyFN0KJp+awJAiuDS3UAOEWISH+oJ5wojHGyRXijj43tLZcTSmupvr28L4zhWRk4Xwgaup7IVPPM7hD1tcp4wd4yifiigCt3FQCv1qD/HC9Qx0iPKTuJywrKzU/6ejOc3IhIl5YCdCTE6V1zjUoBpJ87WbBrkwgoUdjRbpG9g9T6Zmmj3YqmTzY0slOgJMWu+VcQtiy6EjHfl0LSalR11xa58J/T7rDOQzSDYnrOqX7zQ879PRlKpxGMNKe0zL82rbToe6y+sckqmGNPWm6LdXZrG/5Pk3n6mPC90SqXTo1wEN7w2vDf7yuY1DlnyBKJQ1LZB7qhMWG/qONQFBmmJFCaubYbRQ4iak24RvjXNGiolUIBRLll5d01NzVnVu2cnL2WIcZxI5D+Bqh8CWJb3d1CMwzVw2v9SUCFbRKXSEp49pZJPuH9+kmsSjUA3va3mfOrm0SJMEi8M8rtcVyYpfGmpDDx+qOLGpFqB5GgDr2jaQKw== benjaminlabbe@Benjamins-MBP.attlocal.net 2 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Jobs/LogStartupService.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Attributes; 2 | using Xams.Core.Base; 3 | using Xams.Core.Contexts; 4 | using Xams.Core.Dtos; 5 | using Xams.Core.Interfaces; 6 | using Xams.Core.Utils; 7 | 8 | namespace Xams.Core.Jobs; 9 | 10 | // Set order to 101 to ensure it runs after JobStartupService 11 | [ServiceStartup(StartupOperation.Post, 101)] 12 | public class LogStartupService : IServiceStartup 13 | { 14 | public static string SettingName = "LOG_HISTORY_RETENTION_DAYS"; 15 | 16 | public async Task> Execute(StartupContext startupContext) 17 | { 18 | var db = startupContext.DataService.GetDbContext(); 19 | await Queries.GetCreateSetting(db, SettingName, "30"); 20 | return ServiceResult.Success(); 21 | } 22 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/CalendarIcon.tsx: -------------------------------------------------------------------------------- 1 | export function CalendarIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 22 | ) 23 | } 24 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Services/Auditing/AuditCacheRefreshJob.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Attributes; 2 | using Xams.Core.Base; 3 | using Xams.Core.Contexts; 4 | using Xams.Core.Dtos; 5 | using Xams.Core.Interfaces; 6 | using Xams.Core.Utils; 7 | 8 | namespace Xams.Core.Services.Auditing; 9 | 10 | [JobServer(ExecuteJobOn.One)] 11 | [ServiceJob(nameof(AuditCacheRefreshJob), "System", "00:01:00", JobSchedule.Interval, DaysOfWeek.All, "System")] 12 | public class AuditCacheRefreshJob : IServiceJob 13 | { 14 | public async Task> Execute(JobServiceContext context) 15 | { 16 | Console.WriteLine("Refreshing Audit Records Cache"); 17 | await AuditStartupService.CacheAuditRecords(context.GetDbContext()); 18 | 19 | return ServiceResult.Success(); 20 | } 21 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "bundler", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true, 17 | "plugins": [ 18 | { 19 | "name": "next" 20 | } 21 | ], 22 | "paths": { 23 | "@/*": ["./src/*"] 24 | } 25 | }, 26 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 27 | "exclude": ["node_modules"] 28 | } 29 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/components/CodeExample.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Drawer } from "@mantine/core"; 2 | import { useDisclosure } from "@mantine/hooks"; 3 | import React from "react"; 4 | import Highlighter from "./Highlighter"; 5 | 6 | interface CodeExampleProps { 7 | example: JSX.Element; 8 | } 9 | 10 | const CodeExample = (props: CodeExampleProps) => { 11 | const [opened, handlers] = useDisclosure(false); 12 | return ( 13 | <> 14 | 17 | 23 | {props.example} 24 | 25 | 26 | ); 27 | }; 28 | 29 | export default CodeExample; 30 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/api/MetadataResponse.tsx: -------------------------------------------------------------------------------- 1 | export interface MetadataResponse { 2 | displayName: string; 3 | tableName: string; 4 | primaryKey: string; 5 | fields: MetadataField[]; 6 | } 7 | 8 | export interface MetadataField { 9 | name: string; 10 | displayName: string; 11 | type: string; 12 | characterLimit?: number; 13 | order: number; 14 | lookupName: string; 15 | lookupTable: string; 16 | lookupTableNameField: string; 17 | lookupTableDescriptionField: string; 18 | lookupTablePrimaryKeyField: string; 19 | lookupTableHasActiveField: boolean; 20 | dateFormat: string; 21 | isTimeless: boolean; 22 | isNullable: boolean; 23 | isRequired: boolean; 24 | isRecommended: boolean; 25 | isReadOnly: boolean; 26 | option: string; 27 | numberRange: string; 28 | } 29 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableConfirmDeleteMessage.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTableConfirmDeleteMessage = () => { 5 | return ( 6 | <> 7 |

8 | The deleteConfirmation prop can be used to customize the delete 9 | confirmation message. 10 |

11 |
12 | { 15 | return { 16 | title: "Delete Widget?", 17 | message: `Are you sure you want to delete the widget ${data.Name}?`, 18 | }; 19 | }} 20 | /> 21 |
22 | 23 | ); 24 | }; 25 | 26 | export default DataTableConfirmDeleteMessage; 27 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-firebase/src/components/auth/LoginContainer.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Paper } from "@mantine/core"; 3 | 4 | interface LoginContainerProps { 5 | children: React.ReactNode; 6 | maxWidth?: "sm" | "md"; 7 | } 8 | 9 | export const LoginContainer = ({ 10 | children, 11 | maxWidth = "sm", 12 | }: LoginContainerProps) => { 13 | const maxWidthClass = maxWidth === "md" ? "max-w-md" : "max-w-sm"; 14 | 15 | return ( 16 |
17 | 24 | {children} 25 | 26 |
27 | ); 28 | }; 29 | 30 | export default LoginContainer; 31 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Pipeline/PipelineBuilder.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Dtos; 2 | using Xams.Core.Interfaces; 3 | 4 | namespace Xams.Core.Pipeline; 5 | 6 | public class PipelineBuilder 7 | { 8 | private IPipelineStage? _first; 9 | private IPipelineStage? _last; 10 | 11 | public PipelineBuilder Add(IPipelineStage pipelineStage) 12 | { 13 | if (_first == null) 14 | { 15 | _first = pipelineStage; 16 | _last = pipelineStage; 17 | } 18 | else 19 | { 20 | _last!.SetNext(pipelineStage); 21 | _last = pipelineStage; 22 | } 23 | return this; 24 | } 25 | 26 | public async Task> Execute(PipelineContext pipelineContext) 27 | { 28 | return await _first?.Execute(pipelineContext)!; 29 | } 30 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/Prose.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | 3 | export function Prose({ 4 | as, 5 | className, 6 | ...props 7 | }: Omit, 'as' | 'className'> & { 8 | as?: T 9 | className?: string 10 | }) { 11 | let Component = as ?? 'div' 12 | 13 | return ( 14 | *)` is used to select all direct children without an increase in specificity like you'd get from just `& > *` 19 | '[html_:where(&>*)]:mx-auto [html_:where(&>*)]:max-w-2xl [html_:where(&>*)]:lg:mx-[calc(50%-min(50%,theme(maxWidth.lg)))] [html_:where(&>*)]:lg:max-w-3xl', 20 | )} 21 | {...props} 22 | /> 23 | ) 24 | } 25 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Services/Permission/CreatePermissions.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Attributes; 2 | using Xams.Core.Contexts; 3 | using Xams.Core.Dtos; 4 | using Xams.Core.Interfaces; 5 | using Xams.Core.Utils; 6 | 7 | namespace Xams.Core.Services.Permission; 8 | 9 | [ServicePermission] 10 | public class CreatePermissions : IServicePermission 11 | { 12 | public Task>> Execute(PermissionContext permissionContext) 13 | { 14 | // Create Job Permissions 15 | List permissionNames = new(); 16 | foreach (var serviceJob in Cache.Instance.ServiceJobs) 17 | { 18 | var serviceJobInfo = serviceJob.Value; 19 | permissionNames.Add($"JOB_{serviceJobInfo.ServiceJobAttribute.Name}"); 20 | } 21 | return Task.FromResult(ServiceResult.Success(permissionNames)); 22 | } 23 | } -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DataTableFilters.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DataTableFilters = () => { 5 | return ( 6 | <> 7 |

8 | The filters prop on the DataTable component allows for the filtering of 9 | records based on the provided criteria. In this example, the DataTable 10 | is filtered to show only records where the Price is greater than 10. 11 |

12 |
13 | ", 19 | value: "10", 20 | }, 21 | ]} 22 | /> 23 |
24 | 25 | ); 26 | }; 27 | 28 | export default DataTableFilters; 29 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/Audit.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | using Xams.Core.Attributes; 4 | 5 | namespace Xams.Core.Entities; 6 | 7 | [Table(nameof(Audit))] 8 | public class Audit 9 | { 10 | public Guid AuditId { get; set; } 11 | [MaxLength(250)] 12 | [UIReadOnly] 13 | [UIDisplayName("Table Name")] 14 | public string? Name { get; set; } 15 | [UIDisplayName("Create")] 16 | public bool IsCreate { get; set; } 17 | [UIDisplayName("Read")] 18 | public bool IsRead { get; set; } 19 | [UIDisplayName("Update")] 20 | public bool IsUpdate { get; set; } 21 | [UIDisplayName("Delete")] 22 | public bool IsDelete { get; set; } 23 | public bool IsTable { get; set; } 24 | public ICollection AuditFields { get; set; } = null!; 25 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/FolderIcon.tsx: -------------------------------------------------------------------------------- 1 | export function FolderIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 21 | ) 22 | } 23 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Attributes/UIDateFormatAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Xams.Core.Attributes; 2 | 3 | public class UIDateFormatAttribute : Attribute 4 | { 5 | private static readonly string[] _timeParts = 6 | [ 7 | "h", 8 | "m", 9 | "s", 10 | "A", 11 | "a", 12 | "H", 13 | "k", 14 | "K", 15 | "m", 16 | "s", 17 | "S", 18 | "Z", 19 | "X", 20 | "LT", 21 | "LTS", 22 | "LLL", 23 | "LLLL", 24 | "lll", 25 | "llll", 26 | ]; 27 | 28 | public string DateFormat { get; set; } 29 | 30 | public UIDateFormatAttribute(string dateFormat) 31 | { 32 | DateFormat = dateFormat; 33 | } 34 | 35 | public bool HasTimePart() 36 | { 37 | return _timeParts.Any(x => DateFormat.Contains(x)); 38 | } 39 | } -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/admin/nav/AdminDashLogs.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { useAdminDashContext } from "../contexts/AdminDashContext"; 3 | import { NavLink } from "@mantine/core"; 4 | import { IconLogs } from "@tabler/icons-react"; 5 | import LogsViewer from "../components/logviewer/LogsViewer"; 6 | 7 | const AdminDashLogs = () => { 8 | const ctx = useAdminDashContext(); 9 | return ( 10 | <> 11 | {!ctx.props.hiddenMenuItems?.includes("Logs") && ( 12 | } 15 | onClick={() => 16 | ctx.setActiveComponent({ 17 | component: , 18 | }) 19 | } 20 | > 21 | )} 22 | 23 | ); 24 | }; 25 | 26 | export default AdminDashLogs; 27 | -------------------------------------------------------------------------------- /cli/Xams.Cli/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Version 1.0, June 2024 2 | 3 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 4 | 5 | 1. License Grant. 6 | 7 | The Licensor grants you a perpetual, worldwide, royalty-free, non-exclusive license to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the NuGet package (the "Software"), subject to the following conditions: 8 | 9 | 2. Disclaimer of Warranty. 10 | 11 | The Software is provided "AS IS", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the Software or the use or other dealings in the Software. -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/DTFormCloseOptions.tsx: -------------------------------------------------------------------------------- 1 | import { DataTable } from "@ixeta/xams"; 2 | import React from "react"; 3 | 4 | const DTFormCloseOptions = () => { 5 | return ( 6 | <> 7 |

8 | The formCloseOnCreate, formCloseOnEscape, and formCloseOnUpdate props 9 | can be used to control the behavior of the form when creating, updating, 10 | or when the escape key is pressed. By default, the form will close after 11 | creating or updating a record, and when the escape key is pressed. 12 |

13 |
14 | 20 |
21 | 22 | ); 23 | }; 24 | 25 | export default DTFormCloseOptions; 26 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/getQueryParam.tsx: -------------------------------------------------------------------------------- 1 | export function getQueryParam(name: string, url = window.location.href) { 2 | name = name.replace(/[\[\]]/g, "\\$&"); 3 | const regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"); 4 | const results = regex.exec(url); 5 | if (!results) return null; 6 | if (!results[2]) return ""; 7 | return decodeURIComponent(results[2].replace(/\+/g, " ")); 8 | } 9 | 10 | export function addUserIdUrlParam(currentUrl: string, destinationUrl: string) { 11 | const userId = getQueryParam("userid", currentUrl); 12 | if (userId != null) { 13 | let userIdPart = `userid=${userId}`; 14 | if (destinationUrl.includes("?")) { 15 | userIdPart = `&${userIdPart}`; 16 | } else { 17 | userIdPart = `?${userIdPart}`; 18 | } 19 | return destinationUrl + userIdPart; 20 | } else { 21 | return destinationUrl; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /cli/Xams.Cli/README.md: -------------------------------------------------------------------------------- 1 | # NuGet Package for Xams Framework 2 | 3 | ## Overview 4 | 5 | This package is designed for use with the [Xams Framework](https://xams.io). It creates a new project with the necessary files and configurations to get started with the framework. 6 | 7 | ## Usage 8 | 9 | To use the tool, follow these steps: 10 | 11 | 1. Execute the tool. 12 | 2. Follow the prompts to create your projects. 13 | 14 | ## License 15 | 16 | This software is provided under the [NuGet Package License](LICENSE). You are free to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software. 17 | 18 | ## Disclaimer 19 | 20 | The Software is provided "AS IS", without warranty of any kind. For more details, please refer to the license file. 21 | 22 | --- 23 | 24 | For any issues or questions, feel free to reach out to the maintainer. 25 | 26 | Enjoy using the tool! 27 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/getQueryParam.tsx: -------------------------------------------------------------------------------- 1 | export function getQueryParam(name: string, url = window.location.href) { 2 | name = name.replace(/[\[\]]/g, "\\$&"); 3 | const regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"); 4 | const results = regex.exec(url); 5 | if (!results) return null; 6 | if (!results[2]) return ""; 7 | return decodeURIComponent(results[2].replace(/\+/g, " ")); 8 | } 9 | 10 | export function addUserIdUrlParam(currentUrl: string, destinationUrl: string) { 11 | const userId = getQueryParam("userid", currentUrl); 12 | if (userId != null) { 13 | let userIdPart = `userid=${userId}`; 14 | if (destinationUrl.includes("?")) { 15 | userIdPart = `&${userIdPart}`; 16 | } else { 17 | userIdPart = `?${userIdPart}`; 18 | } 19 | return destinationUrl + userIdPart; 20 | } else { 21 | return destinationUrl; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/Migrations/20241101185430_migration06.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore.Migrations; 2 | 3 | #nullable disable 4 | 5 | namespace MyXProject.Data.Migrations 6 | { 7 | /// 8 | public partial class migration06 : Migration 9 | { 10 | /// 11 | protected override void Up(MigrationBuilder migrationBuilder) 12 | { 13 | migrationBuilder.RenameColumn( 14 | name: "Date", 15 | table: "System", 16 | newName: "DateTime"); 17 | } 18 | 19 | /// 20 | protected override void Down(MigrationBuilder migrationBuilder) 21 | { 22 | migrationBuilder.RenameColumn( 23 | name: "DateTime", 24 | table: "System", 25 | newName: "Date"); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Version 1.0, June 2024 2 | 3 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 4 | 5 | 1. License Grant. 6 | 7 | The Licensor grants you a perpetual, worldwide, royalty-free, non-exclusive license to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the NuGet package (the "Software"), subject to the following conditions: 8 | 9 | 2. Disclaimer of Warranty. 10 | 11 | The Software is provided "AS IS", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the Software or the use or other dealings in the Software. -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/Migrations/20240925115326_migration05.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.EntityFrameworkCore.Migrations; 3 | 4 | #nullable disable 5 | 6 | namespace MyXProject.Data.Migrations 7 | { 8 | /// 9 | public partial class migration05 : Migration 10 | { 11 | /// 12 | protected override void Up(MigrationBuilder migrationBuilder) 13 | { 14 | migrationBuilder.AddColumn( 15 | name: "Date", 16 | table: "System", 17 | type: "TEXT", 18 | nullable: true); 19 | } 20 | 21 | /// 22 | protected override void Down(MigrationBuilder migrationBuilder) 23 | { 24 | migrationBuilder.DropColumn( 25 | name: "Date", 26 | table: "System"); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/components/datagrid/DataGridCellError.tsx: -------------------------------------------------------------------------------- 1 | import { Tooltip } from "@mantine/core"; 2 | import React from "react"; 3 | 4 | interface DataGridCellErrorProps { 5 | isEditing: boolean; 6 | errorMessage?: string; 7 | } 8 | 9 | const DataGridCellError = (props: DataGridCellErrorProps) => { 10 | if ( 11 | !props.isEditing && 12 | props.errorMessage != null && 13 | props.errorMessage !== "" 14 | ) { 15 | return ( 16 | 17 |
18 |
19 | ! 20 |
21 |
22 |
23 | ); 24 | } 25 | return <>; 26 | }; 27 | 28 | export default DataGridCellError; 29 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Contexts/HubSendContext.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json; 2 | using Microsoft.AspNetCore.SignalR; 3 | using Xams.Core.Base; 4 | using Xams.Core.Pipeline; 5 | 6 | namespace Xams.Core.Contexts; 7 | 8 | public class HubSendContext : BaseServiceContext 9 | { 10 | public object? Message { get; } 11 | public IGroupManager Groups { get; } 12 | public IHubClients Clients { get; } 13 | 14 | public HubSendContext(PipelineContext pipelineContext, object? message, IHubContext signalRHub) : base(pipelineContext) 15 | { 16 | Message = message; 17 | Groups = signalRHub.Groups; 18 | Clients = signalRHub.Clients; 19 | } 20 | 21 | public T GetMessage() where T : class 22 | { 23 | if (Message == null) 24 | { 25 | throw new Exception("Message is null or empty"); 26 | } 27 | return (T)Message; 28 | } 29 | } -------------------------------------------------------------------------------- /core/xams/Xams.Core/Entities/Job.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | using Xams.Core.Attributes; 4 | 5 | namespace Xams.Core.Entities; 6 | 7 | [Table("Job")] 8 | public class Job 9 | { 10 | public Guid JobId { get; set; } 11 | 12 | [UIReadOnly] 13 | [MaxLength(250)] 14 | public string? Name { get; set; } 15 | 16 | [UIDisplayName("Active")] 17 | public bool IsActive { get; set; } 18 | 19 | [UIReadOnly] 20 | [MaxLength(100)] 21 | public string? Queue { get; set; } 22 | 23 | [UIReadOnly] 24 | [UIDisplayName("Last Execution")] 25 | [UIDateFormat("lll")] 26 | public DateTime LastExecution { get; set; } 27 | 28 | [UIHide(true)] 29 | [MaxLength(100)] 30 | public string? Tag { get; set; } 31 | 32 | public ICollection JobHistories { get; set; } = null!; 33 | } -------------------------------------------------------------------------------- /xams-mcp-server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "xams-mcp-server", 3 | "version": "1.0.0", 4 | "description": "Public MCP server providing Xams Framework documentation for Claude Code", 5 | "type": "module", 6 | "scripts": { 7 | "build": "tsc", 8 | "start": "node build/index.js", 9 | "dev": "tsc && node build/index.js" 10 | }, 11 | "keywords": [ 12 | "mcp", 13 | "xams", 14 | "documentation", 15 | "claude", 16 | "ai", 17 | "http", 18 | "sse" 19 | ], 20 | "author": "Ixeta", 21 | "license": "MIT", 22 | "dependencies": { 23 | "@modelcontextprotocol/sdk": "^0.5.0", 24 | "express": "^4.18.0", 25 | "cors": "^2.8.5" 26 | }, 27 | "devDependencies": { 28 | "@types/node": "^20.0.0", 29 | "@types/express": "^4.17.0", 30 | "@types/cors": "^2.8.0", 31 | "typescript": "^5.3.0" 32 | }, 33 | "engines": { 34 | "node": ">=18.0.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/app/not-found.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@/components/Button' 2 | import { HeroPattern } from '@/components/HeroPattern' 3 | 4 | export default function NotFound() { 5 | return ( 6 | <> 7 | 8 |
9 |

10 | 404 11 |

12 |

13 | Page not found 14 |

15 |

16 | Sorry, we couldn’t find the page you’re looking for. 17 |

18 | 21 |
22 | 23 | ) 24 | } 25 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/FieldTextarea.tsx: -------------------------------------------------------------------------------- 1 | import { useFormBuilder, FormContainer, Field, SaveButton } from "@ixeta/xams"; 2 | import { Grid } from "@mantine/core"; 3 | import React from "react"; 4 | 5 | const FieldTextarea = () => { 6 | const formBuilder = useFormBuilder({ 7 | tableName: "Widget", 8 | }); 9 | return ( 10 | <> 11 |

12 | The varient prop can be set to textarea to render a textarea input 13 | field. 14 |

15 | 16 |
17 |
Widget Form
18 | 19 |
20 | 21 |
22 |
23 |
24 | 25 | ); 26 | }; 27 | 28 | export default FieldTextarea; 29 | -------------------------------------------------------------------------------- /core/xams/MyXProject.Web/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base 2 | WORKDIR /app 3 | EXPOSE 80 4 | EXPOSE 443 5 | 6 | FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build 7 | WORKDIR /src 8 | COPY ["MyXProject.Web/MyXProject.Web.csproj", "MyXProject.Web/"] 9 | COPY ["MyXProject.Services/MyXProject.Services.csproj", "MyXProject.Services/"] 10 | COPY ["MyXProject.Data/MyXProject.Data.csproj", "MyXProject.Data/"] 11 | COPY ["MyXProject.Common/MyXProject.Common.csproj", "MyXProject.Common/"] 12 | RUN dotnet restore "MyXProject.Web/MyXProject.Web.csproj" 13 | COPY . . 14 | WORKDIR "/src/MyXProject.Web" 15 | RUN dotnet build "MyXProject.Web.csproj" -c Release -o /app/build 16 | 17 | FROM build AS publish 18 | RUN dotnet publish "MyXProject.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false 19 | 20 | FROM base AS final 21 | WORKDIR /app 22 | COPY --from=publish /app/publish . 23 | ENTRYPOINT ["dotnet", "MyXProject.Web.dll"] 24 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Base/BaseEntity.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore; 2 | using Xams.Core.Attributes; 3 | using Xams.Core.Entities; 4 | 5 | namespace Xams.Core.Base; 6 | 7 | [Index(nameof(OwningUserId))] 8 | [Index(nameof(OwningTeamId))] 9 | public class BaseEntity 10 | { 11 | 12 | [UIDisplayName("Owning User")] 13 | public Guid? OwningUserId { get; set; } 14 | public User? OwningUser { get; set; } 15 | [UIDisplayName("Owning Team")] 16 | public Guid? OwningTeamId { get; set; } 17 | public Team? OwningTeam { get; set; } 18 | [UIDateFormat("lll")] 19 | public DateTime CreatedDate { get; set; } 20 | [UIDateFormat("lll")] 21 | public DateTime UpdatedDate { get; set; } 22 | public Guid CreatedById { get; set; } 23 | public User? CreatedBy { get; set; } 24 | public Guid UpdatedById { get; set; } 25 | public User? UpdatedBy { get; set; } 26 | 27 | public bool IsActive { get; set; } 28 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/app/page.mdx: -------------------------------------------------------------------------------- 1 | import { Guides } from '@/components/Guides' 2 | import { Resources } from '@/components/Resources' 3 | import { HeroPattern } from '@/components/HeroPattern' 4 | 5 | export const metadata = { 6 | title: 'Xams Documentation', 7 | description: 'Learn how Xams accelerates development', 8 | } 9 | 10 | export const sections = [] 11 | 12 | 13 | 14 | # Introduction 15 | 16 | Xams is a framework built to accelerate application development. It utilizes React for the front end and C# .NET for the application layer. With tight integration into the Entity Framework, Xams offers compatibility with a variety of databases, including SQLite, MySQL, PostgreSQL, and Microsoft SQL Server. {{ className: 'lead' }} 17 | 18 |
19 | 22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/images/logos/python.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Utils/SqlTranslator.cs: -------------------------------------------------------------------------------- 1 | using System.Text.RegularExpressions; 2 | using Xams.Core.Base; 3 | 4 | namespace Xams.Core.Utils; 5 | 6 | public class SqlTranslator 7 | { 8 | public static string Translate(string postgresqlQuery, DbProvider targetDb) 9 | { 10 | string translatedQuery = postgresqlQuery; 11 | 12 | // Replace double quotes with backticks for MySQL and SQLite, or with square brackets for SQL Server 13 | if (targetDb is DbProvider.MySQL or DbProvider.SQLite) 14 | { 15 | translatedQuery = Regex.Replace(translatedQuery, "\"([^\"]+)\"", "`$1`"); 16 | } 17 | else if (targetDb == DbProvider.SQLServer) 18 | { 19 | translatedQuery = Regex.Replace(translatedQuery, "\"([^\"]+)\"", "[$1]"); 20 | } 21 | else 22 | { 23 | translatedQuery = postgresqlQuery; 24 | } 25 | 26 | return translatedQuery; 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/examples/FieldRichText.tsx: -------------------------------------------------------------------------------- 1 | import { useFormBuilder, FormContainer, Field, SaveButton } from "@ixeta/xams"; 2 | import { Grid } from "@mantine/core"; 3 | import React from "react"; 4 | 5 | const FieldRichText = () => { 6 | const formBuilder = useFormBuilder({ 7 | tableName: "Widget", 8 | }); 9 | return ( 10 | <> 11 |

12 | The varient prop can be set to rich to render a rich text input field. 13 |

14 | 15 |
16 |
Widget Form
17 |
18 | 19 |
20 |
21 | 22 |
23 |
24 |
25 | 26 | ); 27 | }; 28 | 29 | export default FieldRichText; 30 | -------------------------------------------------------------------------------- /cli/Xams.Cli/Xams.Cli.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net8.0 6 | enable 7 | enable 8 | 12 9 | true 10 | xams-cli 11 | ./nupkg 12 | README.md 13 | LICENSE.txt 14 | 1.0.3 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Pipeline/Stages/Shared/PipelineUtil.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Dtos; 2 | using Xams.Core.Dtos.Data; 3 | 4 | namespace Xams.Core.Pipeline.Stages.Shared; 5 | 6 | public static class PipelineUtil 7 | { 8 | public static async Task> SetExistingEntity(PipelineContext context, Guid id) 9 | { 10 | // Get the record from the database to check its *current* owning team\user 11 | Response readResponse = await context.DataRepository.Find(context.TableName!, id, true); 12 | 13 | if (!readResponse.Succeeded || readResponse.Data == null || readResponse.Data == null) 14 | { 15 | return new Response() 16 | { 17 | Succeeded = false, 18 | FriendlyMessage = $"Could not find the record with id {id} in the {context.TableName} table." 19 | }; 20 | } 21 | 22 | context.PreEntity = readResponse.Data; 23 | 24 | return readResponse; 25 | } 26 | } -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams/src/contexts/FormContext.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { useFormBuilderType } from "../hooks/useFormBuilder"; 3 | 4 | export type FormContextShape = { 5 | formBuilder: useFormBuilderType; 6 | }; 7 | 8 | interface FormContextProps { 9 | children?: any; 10 | formBuilder: useFormBuilderType; 11 | } 12 | 13 | export const FormContext = React.createContext(null); 14 | 15 | export const useFormContext = () => { 16 | const context = React.useContext(FormContext); 17 | if (!context) { 18 | throw new Error("useFormContext must be used within a FormContextProvider"); 19 | } 20 | return context; 21 | }; 22 | 23 | const FormContextProvider = (props: FormContextProps) => { 24 | return ( 25 | 30 | {props.children} 31 | 32 | ); 33 | }; 34 | 35 | export default FormContextProvider; 36 | -------------------------------------------------------------------------------- /cli/Xams.Cli/CreateApi.cs: -------------------------------------------------------------------------------- 1 | using System.IO.Compression; 2 | using System.Net.Mail; 3 | using System.Text; 4 | using System.Text.Json; 5 | using System.Text.RegularExpressions; 6 | using Spectre.Console; 7 | using Xams.Cli.Utils; 8 | 9 | namespace Xams.Cli; 10 | 11 | public class CreateApi 12 | { 13 | public async Task Execute(Download.DownloadOptions options) 14 | { 15 | options.Mutations = async (context) => 16 | { 17 | ReplaceUtil.ReplaceTextInFiles(context.ProjectDirectory, "MyXProject", context.ProjectName); 18 | ReplaceUtil.ReplaceTextInFiles(context.ProjectDirectory, "MyXProject".ToLower(), 19 | context.ProjectName.ToLower()); 20 | ReplaceUtil.SearchAndReplaceFileName(context.ProjectDirectory, "MyXProject", context.ProjectName); 21 | ReplaceUtil.SearchAndReplaceFolderName(context.ProjectDirectory, "MyXProject", context.ProjectName); 22 | }; 23 | 24 | await new Download().Execute(options); 25 | } 26 | } -------------------------------------------------------------------------------- /core/xams-workspace/ixeta-xams-lite/src/index.ts: -------------------------------------------------------------------------------- 1 | export { default as useAuthRequest } from "./hooks/useAuthRequest"; 2 | export type { ReadFilter as ReadFilter } from "./api/ReadRequest"; 3 | export { 4 | default as AppContextProvider, 5 | useAppContext, 6 | } from "./contexts/AppContext"; 7 | export { default as AuthContextProvider } from "./contexts/AuthContext"; 8 | export { useAuthContext } from "./contexts/AuthContext"; 9 | export { 10 | getQueryParam, 11 | addUserIdUrlParam as getUserIdUrlPart, 12 | } from "./getQueryParam"; 13 | export { 14 | API_DATA_PERMISSIONS, 15 | API_DATA_ACTION, 16 | API_DATA_CREATE, 17 | API_DATA_READ, 18 | API_DATA_UPDATE, 19 | API_DATA_DELETE, 20 | API_DATA_FILE, 21 | API_DATA_METADATA, 22 | } from "./apiurls"; 23 | export * from "./api/TablesResponse"; 24 | export * from "./api/ReadRequest"; 25 | export * from "./api/ReadResponse"; 26 | export * from "./utils/Query"; 27 | export type { useAuthRequestType as useAuthRequestType } from "./hooks/useAuthRequest"; 28 | -------------------------------------------------------------------------------- /core/xams/Xams.Core/Pipeline/Stages/PipePreValidation.cs: -------------------------------------------------------------------------------- 1 | using Xams.Core.Attributes; 2 | using Xams.Core.Base; 3 | using Xams.Core.Dtos; 4 | 5 | namespace Xams.Core.Pipeline.Stages; 6 | 7 | public class PipePreValidation : BasePipelineStage 8 | { 9 | public override async Task> Execute(PipelineContext context) 10 | { 11 | if (context.UserId == Guid.Empty) 12 | { 13 | return new Response() 14 | { 15 | Succeeded = false, 16 | FriendlyMessage = "User ID is required." 17 | }; 18 | } 19 | 20 | if (context.Entity == null && context.DataOperation is not DataOperation.Read) 21 | { 22 | return new Response() 23 | { 24 | Succeeded = false, 25 | FriendlyMessage = $"Cannot {context.DataOperation.ToString()} null entity." 26 | }; 27 | } 28 | 29 | return await base.Execute(context); 30 | } 31 | } -------------------------------------------------------------------------------- /xams-mcp-server/docs/xams-docs-v1/src/components/icons/UsersIcon.tsx: -------------------------------------------------------------------------------- 1 | export function UsersIcon(props: React.ComponentPropsWithoutRef<'svg'>) { 2 | return ( 3 | 27 | ) 28 | } 29 | -------------------------------------------------------------------------------- /core/xams-workspace/examples-app/src/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable @next/next/next-script-for-ga */ 2 | import { Html, Head, Main, NextScript } from "next/document"; 3 | 4 | export default function Document() { 5 | return ( 6 | 7 | 8 | 12 |