@ynput/ayon-frontend-shared 0.2.30 → 0.2.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/index.cjs5.js +1 -1
- package/dist/_virtual/index.cjs6.js +1 -1
- package/dist/_virtual/index.es5.js +5 -2
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/_virtual/index.es6.js +2 -5
- package/dist/_virtual/index.es6.js.map +1 -1
- package/dist/node_modules/rehype-prism-plus/dist/index.es.cjs.js +1 -1
- package/dist/node_modules/rehype-prism-plus/dist/index.es.es.js +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/shared/src/api/generated/access.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/access.es.js.map +1 -1
- package/dist/shared/src/api/generated/authentication.cjs.js +1 -1
- package/dist/shared/src/api/generated/authentication.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/authentication.es.js +9 -6
- package/dist/shared/src/api/generated/authentication.es.js.map +1 -1
- package/dist/shared/src/api/generated/entityLists.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/entityLists.es.js.map +1 -1
- package/dist/shared/src/api/generated/folders.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/folders.es.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/api/generated/graphqlLinks.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphqlLinks.es.js.map +1 -1
- package/dist/shared/src/api/generated/links.cjs.js +1 -1
- package/dist/shared/src/api/generated/links.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/links.es.js +13 -5
- package/dist/shared/src/api/generated/links.es.js.map +1 -1
- package/dist/shared/src/api/generated/onboarding.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/onboarding.es.js.map +1 -1
- package/dist/shared/src/api/generated/operations.cjs.js +1 -1
- package/dist/shared/src/api/generated/operations.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/operations.es.js +16 -0
- package/dist/shared/src/api/generated/operations.es.js.map +1 -1
- package/dist/shared/src/api/generated/products.cjs.js +1 -1
- package/dist/shared/src/api/generated/products.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/products.es.js +6 -3
- package/dist/shared/src/api/generated/products.es.js.map +1 -1
- package/dist/shared/src/api/generated/projects.cjs.js +1 -1
- package/dist/shared/src/api/generated/projects.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/projects.es.js +19 -0
- package/dist/shared/src/api/generated/projects.es.js.map +1 -1
- package/dist/shared/src/api/generated/system.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/system.es.js.map +1 -1
- package/dist/shared/src/api/generated/tasks.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/tasks.es.js.map +1 -1
- package/dist/shared/src/api/generated/users.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/users.es.js.map +1 -1
- package/dist/shared/src/api/generated/versions.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/versions.es.js.map +1 -1
- package/dist/shared/src/api/generated/views.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/views.es.js.map +1 -1
- package/dist/shared/src/api/queries/entityLists/listFolders.cjs.js +1 -1
- package/dist/shared/src/api/queries/entityLists/listFolders.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/entityLists/listFolders.es.js +96 -59
- package/dist/shared/src/api/queries/entityLists/listFolders.es.js.map +1 -1
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.cjs.js +1 -1
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.cjs.js.map +1 -1
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.es.js +15 -10
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/RowHeightSettings.cjs.js +60 -0
- package/dist/shared/src/components/ProjectTableSettings/RowHeightSettings.cjs.js.map +1 -0
- package/dist/shared/src/components/ProjectTableSettings/RowHeightSettings.es.js +332 -0
- package/dist/shared/src/components/ProjectTableSettings/RowHeightSettings.es.js.map +1 -0
- package/dist/shared/src/components/SettingsPanel/SettingsPanel.cjs.js +4 -4
- package/dist/shared/src/components/SettingsPanel/SettingsPanel.cjs.js.map +1 -1
- package/dist/shared/src/components/SettingsPanel/SettingsPanel.es.js +37 -33
- package/dist/shared/src/components/SettingsPanel/SettingsPanel.es.js.map +1 -1
- package/dist/shared/src/components/Thumbnail/Thumbnail.styled.cjs.js +3 -5
- package/dist/shared/src/components/Thumbnail/Thumbnail.styled.cjs.js.map +1 -1
- package/dist/shared/src/components/Thumbnail/Thumbnail.styled.es.js +4 -6
- package/dist/shared/src/components/Thumbnail/Thumbnail.styled.es.js.map +1 -1
- package/dist/shared/src/components/ThumbnailSimple/ThumbnailSimple.cjs.js +1 -2
- package/dist/shared/src/components/ThumbnailSimple/ThumbnailSimple.cjs.js.map +1 -1
- package/dist/shared/src/components/ThumbnailSimple/ThumbnailSimple.es.js +0 -1
- package/dist/shared/src/components/ThumbnailSimple/ThumbnailSimple.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +555 -537
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js +0 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js +4 -5
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +92 -91
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.es.js +126 -108
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useDynamicRowHeight.cjs.js +2 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useDynamicRowHeight.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useDynamicRowHeight.es.js +9 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useDynamicRowHeight.es.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +2 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +49 -48
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js +38 -9
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js +74 -39
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js +24 -15
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js +71 -59
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.cjs.js +6 -6
- package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.es.js +12 -12
- package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.es.js.map +1 -1
- package/dist/shared/src/util/columnConfigConverter.cjs.js +1 -1
- package/dist/shared/src/util/columnConfigConverter.cjs.js.map +1 -1
- package/dist/shared/src/util/columnConfigConverter.es.js +35 -33
- package/dist/shared/src/util/columnConfigConverter.es.js.map +1 -1
- package/dist/types/api/generated/access.d.ts +6 -0
- package/dist/types/api/generated/authentication.d.ts +6 -0
- package/dist/types/api/generated/entityLists.d.ts +7 -7
- package/dist/types/api/generated/folders.d.ts +2 -2
- package/dist/types/api/generated/graphql.d.ts +3 -1
- package/dist/types/api/generated/graphqlLinks.d.ts +21 -15
- package/dist/types/api/generated/links.d.ts +4 -0
- package/dist/types/api/generated/onboarding.d.ts +3 -0
- package/dist/types/api/generated/operations.d.ts +22 -1
- package/dist/types/api/generated/products.d.ts +23 -0
- package/dist/types/api/generated/projects.d.ts +63 -0
- package/dist/types/api/generated/representations.d.ts +1 -0
- package/dist/types/api/generated/system.d.ts +9 -2
- package/dist/types/api/generated/tasks.d.ts +1 -0
- package/dist/types/api/generated/users.d.ts +1 -1
- package/dist/types/api/generated/versions.d.ts +1 -0
- package/dist/types/api/generated/views.d.ts +50 -9
- package/dist/types/api/queries/authentication/getAuthentication.d.ts +1 -0
- package/dist/types/api/queries/overview/updateOverview.d.ts +2 -0
- package/dist/types/api/queries/project/getProject.d.ts +4 -0
- package/dist/types/components/ProjectTableSettings/RowHeightSettings.d.ts +3 -0
- package/dist/types/containers/ProjectTreeTable/context/ColumnSettingsContext.d.ts +4 -0
- package/dist/types/containers/ProjectTreeTable/hooks/useDynamicRowHeight.d.ts +11 -0
- package/dist/types/containers/ProjectTreeTable/widgets/EntityNameWidget.d.ts +2 -1
- package/dist/types/containers/ProjectTreeTable/widgets/EnumCellValue.d.ts +2 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listFolders.es.js","sources":["../../../../../../src/api/queries/entityLists/listFolders.ts"],"sourcesContent":["import { EntityListFoldersResponseModel } from '@shared/api/generated'\
|
|
1
|
+
{"version":3,"file":"listFolders.es.js","sources":["../../../../../../src/api/queries/entityLists/listFolders.ts"],"sourcesContent":["import { entityListsApi, EntityListFoldersResponseModel } from '@shared/api/generated'\n\nconst LIST_FOLDER_LIST_TAG = { type: 'entityListFolder' as const, id: 'LIST' }\n\n// QUERY TYPE RESULTS\n\ntype GetEntityListFoldersResult = NonNullable<EntityListFoldersResponseModel['folders']>\n\n// REDEFINE TYPES\nimport { DefinitionsFromApi, OverrideResultType, TagTypesFromApi } from '@reduxjs/toolkit/query'\nimport { getEntityId } from '@shared/util'\ntype Definitions = DefinitionsFromApi<typeof entityListsApi>\ntype TagTypes = TagTypesFromApi<typeof entityListsApi>\n// update the definitions to include the new types\ntype UpdatedDefinitions = Omit<Definitions, 'getEntityListFolders'> & {\n getEntityListFolders: OverrideResultType<\n Definitions['getEntityListFolders'],\n GetEntityListFoldersResult\n >\n}\n\nconst transformErrorResponse = (error: any) => error.data?.detail || 'Unknown lists folder error'\n\nconst enhancedListsFoldersApi = entityListsApi.enhanceEndpoints<TagTypes, UpdatedDefinitions>({\n endpoints: {\n getEntityListFolders: {\n transformResponse: (response: EntityListFoldersResponseModel) => response.folders || [],\n transformErrorResponse,\n providesTags: (result) =>\n result\n ? [\n LIST_FOLDER_LIST_TAG,\n ...result.map((folder) => ({ type: 'entityListFolder', id: folder.id })),\n ]\n : [LIST_FOLDER_LIST_TAG],\n },\n createEntityListFolder: {\n async onQueryStarted(\n { projectName, entityListFolderPostModel },\n { dispatch, queryFulfilled },\n ) {\n // Optimistically add the new folder to the cache\n const patchResult = dispatch(\n enhancedListsFoldersApi.util.updateQueryData(\n 'getEntityListFolders',\n { projectName },\n (draft) => {\n // Create the optimistic folder with a temporary ID if none provided\n const newFolder = {\n ...entityListFolderPostModel,\n id: entityListFolderPostModel.id || getEntityId(),\n }\n draft.push(newFolder)\n },\n ),\n )\n\n try {\n await queryFulfilled\n } catch {\n // Undo the optimistic update if the mutation fails\n patchResult.undo()\n }\n },\n transformErrorResponse,\n invalidatesTags: [LIST_FOLDER_LIST_TAG],\n },\n deleteEntityListFolder: {\n async onQueryStarted({ projectName, folderId }, { dispatch, queryFulfilled }) {\n // Optimistically remove the folder from the cache\n const patchResult = dispatch(\n enhancedListsFoldersApi.util.updateQueryData(\n 'getEntityListFolders',\n { projectName },\n (draft) => {\n const folderIndex = draft.findIndex((folder) => folder.id === folderId)\n if (folderIndex !== -1) {\n draft.splice(folderIndex, 1)\n }\n },\n ),\n )\n\n try {\n await queryFulfilled\n } catch {\n // Undo the optimistic update if the mutation fails\n patchResult.undo()\n }\n },\n transformErrorResponse,\n invalidatesTags: (_r, _e, arg) => [\n { type: 'entityListFolder', id: arg.folderId },\n { type: 'entityList', id: arg.folderId },\n ],\n },\n updateEntityListFolder: {\n async onQueryStarted(\n { projectName, folderId, entityListFolderPatchModel },\n { dispatch, queryFulfilled },\n ) {\n // Optimistically update the folder in the cache\n const patchResult = dispatch(\n enhancedListsFoldersApi.util.updateQueryData(\n 'getEntityListFolders',\n { projectName },\n (draft) => {\n const folderIndex = draft.findIndex((folder) => folder.id === folderId)\n if (folderIndex !== -1) {\n const folder = draft[folderIndex]\n // Update the folder with the patch data\n Object.assign(folder, {\n ...folder,\n ...entityListFolderPatchModel,\n data: {\n ...folder.data,\n ...entityListFolderPatchModel.data,\n },\n })\n }\n },\n ),\n )\n\n try {\n await queryFulfilled\n } catch {\n // Undo the optimistic update if the mutation fails\n patchResult.undo()\n }\n },\n transformErrorResponse,\n invalidatesTags: (_r, _e, arg) => [{ type: 'entityListFolder', id: arg.folderId }],\n },\n },\n})\n\nexport const {\n useGetEntityListFoldersQuery,\n useCreateEntityListFolderMutation,\n useDeleteEntityListFolderMutation,\n useUpdateEntityListFolderMutation,\n} = enhancedListsFoldersApi\n"],"names":["LIST_FOLDER_LIST_TAG","transformErrorResponse","error","_a","enhancedListsFoldersApi","entityListsApi","response","result","folder","projectName","entityListFolderPostModel","dispatch","queryFulfilled","patchResult","draft","newFolder","getEntityId","folderId","folderIndex","_r","_e","arg","entityListFolderPatchModel","useGetEntityListFoldersQuery","useCreateEntityListFolderMutation","useDeleteEntityListFolderMutation","useUpdateEntityListFolderMutation"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../../../_virtual/jsx-runtime.cjs.js"),k=require("react"),a=require("@ynput/ayon-react-components"),T=require("lodash"),P=require("./components/MinMaxField.cjs.js"),A=require("../EnumEditor/EnumEditor.cjs.js");require("../EnumEditor/EnumEditor.styled.cjs.js");const B=[{value:"project",label:"Project"},{value:"folder",label:"Folder"},{value:"task",label:"Task"},{value:"product",label:"Product"},{value:"version",label:"Version"},{value:"representation",label:"Representation"},{value:"user",label:"User"}],K=[{value:"description",scope:null},{value:"example",scope:null},{value:"default",scope:["project"]},{value:"inherit",scope:null}],S={string:{value:"string",label:"String",fields:["minLength","maxLength","enum","regex"]},integer:{value:"integer",label:"Integer",fields:["ge","gt","le","lt"]},float:{value:"float",label:"Decimal number",fields:["ge","gt","le","lt"]},list_of_strings:{value:"list_of_strings",label:"List Of Strings",fields:["minItems","maxItems","enum"]},boolean:{value:"boolean",label:"Boolean",fields:[],exclude:["example"]}},V={name:"",scope:["folder","task"],builtin:!1,position:0,data:{type:"string",title:"",description:"",example:"",default:void 0,enum:void 0,minLength:void 0,maxLength:void 0,regex:"",minItems:void 0,maxItems:void 0,ge:void 0,gt:void 0,le:void 0,lt:void 0}},z=(u,c)=>{const l=JSON.parse(JSON.stringify(V)),g=["name"];Object.keys(l).forEach(r=>{!g.includes(r)&&u.includes(r)&&r!=="data"&&delete l[r]});const d=["title"];return l.data&&Object.keys(l.data).forEach(r=>{!d.includes(r)&&u.includes(r)&&delete l.data[r]}),c&&Object.keys(c).forEach(r=>{const p=r;p!=="data"&&u.includes(p)||(p==="data"&&c.data&&l.data?l.data={...l.data,...c.data}:c[p]!==void 0&&(l[p]=c[p]))}),l},J=({attribute:u,existingNames:c,error:l="",isUpdating:g,excludes:d=[],onHide:r,onEdit:p,onDelete:I})=>{var O,N;const q=z(d,{position:c.length}),[t,b]=k.useState(u||q);k.useEffect(()=>{u&&b(u)},[u]);const E=!u,y=(e,s)=>{b(n=>n&&{...n,[e]:s})},h=(e,s)=>{b(n=>{if(!n||!n.data)return n;const m={...n.data,[e]:s};return{...n,data:m}})};let j="";t&&E&&(c.includes(t.name)?j="This attribute already exists":t.name.match("^[a-zA-Z_]{2,64}$")||(l="Invalid attribute name"));const w=()=>{t&&p(t)},F=i.jsxRuntimeExports.jsxs("div",{style:{display:"flex",width:"100%",flexDirection:"row"},children:[I&&u&&i.jsxRuntimeExports.jsx(a.Button,{variant:"danger",label:"Delete attribute",icon:"delete",disabled:g,onClick:I}),i.jsxRuntimeExports.jsx(a.Spacer,{}),i.jsxRuntimeExports.jsx(a.SaveButton,{label:E?"Create Attribute":"Save Attribute",icon:"check",disabled:!!j||!t,active:!j&&!!t,saving:g,onClick:w})]});let R=[];if(K.forEach(e=>{var s;(!(e!=null&&e.scope)||(s=e==null?void 0:e.scope)!=null&&s.some(n=>{var m;return(m=t==null?void 0:t.scope)==null?void 0:m.includes(n)}))&&R.push(e.value)}),t!=null&&t.data.type&&S[t.data.type]){const e=S[t.data.type];R=[...R,...e.fields].filter(s=>{var n;return!((n=e.exclude)!=null&&n.includes(s))})}const C={enum:(e=[],s)=>i.jsxRuntimeExports.jsx(A.EnumEditor,{values:e,onChange:n=>{s(n!=null&&n.length?n:void 0)}}),inherit:(e,s)=>i.jsxRuntimeExports.jsx(a.InputSwitch,{checked:e,onChange:n=>s(n.target.checked)}),booleanDefault:(e,s)=>i.jsxRuntimeExports.jsx(a.InputSwitch,{checked:e,onChange:n=>s(n.target.checked)})},M=e=>{const s=e.target.value;h("title",s),E&&y("name",T.camelCase(s))};return i.jsxRuntimeExports.jsx(a.Dialog,{header:((O=t==null?void 0:t.data)==null?void 0:O.title)||(t==null?void 0:t.name)||"New attribute",footer:F,onClose:r,isOpen:!0,style:{width:700,zIndex:999},size:"full",onKeyDown:e=>{e.key==="Enter"&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),w())},children:t&&i.jsxRuntimeExports.jsxs(a.FormLayout,{children:[!d.includes("title")&&i.jsxRuntimeExports.jsx(a.FormRow,{label:"Title",children:i.jsxRuntimeExports.jsx(a.InputText,{value:t==null?void 0:t.data.title,onChange:M,autoFocus:!0})},"title"),!d.includes("name")&&i.jsxRuntimeExports.jsx(a.FormRow,{label:"Name",children:i.jsxRuntimeExports.jsx(a.LockedInput,{value:t.name,disabled:!E,onSubmit:e=>y("name",e),label:"name"})},"name"),!d.includes("scope")&&i.jsxRuntimeExports.jsx(a.FormRow,{label:"Scope",children:i.jsxRuntimeExports.jsx(a.Dropdown,{options:B,disabled:t.builtin,value:t.scope||[],onChange:e=>y("scope",e),multiSelect:!0,widthExpand:!0})}),!d.includes("type")&&i.jsxRuntimeExports.jsx(a.FormRow,{label:"Type",children:i.jsxRuntimeExports.jsx(a.Dropdown,{value:[(N=t==null?void 0:t.data)==null?void 0:N.type],disabled:t.builtin,options:Object.values(S),onChange:e=>h("type",e[0]),minSelected:1,widthExpand:!0})}),R.map(e=>{var m,L;if(d.includes(e))return null;let s=null,n=T.upperFirst(e);if(e==="enum"||e==="inherit"){const o=C[e];s=o(t==null?void 0:t.data[e],v=>h(e,v))}else if(e==="default"&&((m=t==null?void 0:t.data)==null?void 0:m.type)==="boolean")s=C.booleanDefault(t==null?void 0:t.data[e],o=>h(e,o));else if(["ge","gt","le","lt"].includes(e)){if(["gt","lt"].includes(e))return null;s=i.jsxRuntimeExports.jsx(P.MinMaxField,{value:t==null?void 0:t.data,isMin:e==="ge",isFloat:((L=t==null?void 0:t.data)==null?void 0:L.type)==="float",onChange:o=>{const v=o.ge!==void 0?Number(o.ge):void 0,f=o.le!==void 0?Number(o.le):void 0;o.ge!==void 0&&isNaN(v)||o.le!==void 0&&isNaN(f)||b(x=>{if(!x||!x.data)return x;const _={...x.data,...o};return{...x,data:_}})}}),n=e==="ge"?"Min":"Max"}else{const o=v=>{const f=v.target.value;switch(e){case"minLength":case"maxLength":case"minItems":case"maxItems":{const x=parseInt(f,10);h(e,isNaN(x)?void 0:x);break}default:h(e,f);break}};s=i.jsxRuntimeExports.jsx(a.InputText,{value:String((t==null?void 0:t.data[e])??""),onChange:o})}return i.jsxRuntimeExports.jsx(a.FormRow,{label:n,style:{alignItems:"flex-start"},children:s},e)}),i.jsxRuntimeExports.jsx("span",{children:(j||l)&&i.jsxRuntimeExports.jsx("span",{className:"form-error-text",children:j||l})})]})})};exports.AttributeEditor=J;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../../../_virtual/jsx-runtime.cjs.js"),k=require("react"),a=require("@ynput/ayon-react-components"),T=require("lodash"),P=require("./components/MinMaxField.cjs.js"),A=require("../EnumEditor/EnumEditor.cjs.js");require("../EnumEditor/EnumEditor.styled.cjs.js");const B=[{value:"project",label:"Project"},{value:"folder",label:"Folder"},{value:"task",label:"Task"},{value:"product",label:"Product"},{value:"version",label:"Version"},{value:"representation",label:"Representation"},{value:"user",label:"User"}],K=[{value:"description",scope:null},{value:"example",scope:null},{value:"default",scope:["project"]},{value:"inherit",scope:null}],S={string:{value:"string",label:"String",fields:["minLength","maxLength","enum","regex"]},integer:{value:"integer",label:"Integer",fields:["ge","gt","le","lt"]},float:{value:"float",label:"Decimal number",fields:["ge","gt","le","lt"]},list_of_strings:{value:"list_of_strings",label:"List Of Strings",fields:["minItems","maxItems","enum"]},boolean:{value:"boolean",label:"Boolean",fields:[],exclude:["example"]},datetime:{value:"datetime",label:"Datetime",fields:[]}},V={name:"",scope:["folder","task"],builtin:!1,position:0,data:{type:"string",title:"",description:"",example:"",default:void 0,enum:void 0,minLength:void 0,maxLength:void 0,regex:"",minItems:void 0,maxItems:void 0,ge:void 0,gt:void 0,le:void 0,lt:void 0}},z=(u,c)=>{const l=JSON.parse(JSON.stringify(V)),g=["name"];Object.keys(l).forEach(r=>{!g.includes(r)&&u.includes(r)&&r!=="data"&&delete l[r]});const d=["title"];return l.data&&Object.keys(l.data).forEach(r=>{!d.includes(r)&&u.includes(r)&&delete l.data[r]}),c&&Object.keys(c).forEach(r=>{const p=r;p!=="data"&&u.includes(p)||(p==="data"&&c.data&&l.data?l.data={...l.data,...c.data}:c[p]!==void 0&&(l[p]=c[p]))}),l},J=({attribute:u,existingNames:c,error:l="",isUpdating:g,excludes:d=[],onHide:r,onEdit:p,onDelete:I})=>{var O,N;const q=z(d,{position:c.length}),[t,b]=k.useState(u||q);k.useEffect(()=>{u&&b(u)},[u]);const E=!u,y=(e,s)=>{b(n=>n&&{...n,[e]:s})},h=(e,s)=>{b(n=>{if(!n||!n.data)return n;const m={...n.data,[e]:s};return{...n,data:m}})};let j="";t&&E&&(c.includes(t.name)?j="This attribute already exists":t.name.match("^[a-zA-Z_]{2,64}$")||(l="Invalid attribute name"));const w=()=>{t&&p(t)},F=i.jsxRuntimeExports.jsxs("div",{style:{display:"flex",width:"100%",flexDirection:"row"},children:[I&&u&&i.jsxRuntimeExports.jsx(a.Button,{variant:"danger",label:"Delete attribute",icon:"delete",disabled:g,onClick:I}),i.jsxRuntimeExports.jsx(a.Spacer,{}),i.jsxRuntimeExports.jsx(a.SaveButton,{label:E?"Create Attribute":"Save Attribute",icon:"check",disabled:!!j||!t,active:!j&&!!t,saving:g,onClick:w})]});let R=[];if(K.forEach(e=>{var s;(!(e!=null&&e.scope)||(s=e==null?void 0:e.scope)!=null&&s.some(n=>{var m;return(m=t==null?void 0:t.scope)==null?void 0:m.includes(n)}))&&R.push(e.value)}),t!=null&&t.data.type&&S[t.data.type]){const e=S[t.data.type];R=[...R,...e.fields].filter(s=>{var n;return!((n=e.exclude)!=null&&n.includes(s))})}const C={enum:(e=[],s)=>i.jsxRuntimeExports.jsx(A.EnumEditor,{values:e,onChange:n=>{s(n!=null&&n.length?n:void 0)}}),inherit:(e,s)=>i.jsxRuntimeExports.jsx(a.InputSwitch,{checked:e,onChange:n=>s(n.target.checked)}),booleanDefault:(e,s)=>i.jsxRuntimeExports.jsx(a.InputSwitch,{checked:e,onChange:n=>s(n.target.checked)})},M=e=>{const s=e.target.value;h("title",s),E&&y("name",T.camelCase(s))};return i.jsxRuntimeExports.jsx(a.Dialog,{header:((O=t==null?void 0:t.data)==null?void 0:O.title)||(t==null?void 0:t.name)||"New attribute",footer:F,onClose:r,isOpen:!0,style:{width:700,zIndex:999},size:"full",onKeyDown:e=>{e.key==="Enter"&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),w())},children:t&&i.jsxRuntimeExports.jsxs(a.FormLayout,{children:[!d.includes("title")&&i.jsxRuntimeExports.jsx(a.FormRow,{label:"Title",children:i.jsxRuntimeExports.jsx(a.InputText,{value:t==null?void 0:t.data.title,onChange:M,autoFocus:!0})},"title"),!d.includes("name")&&i.jsxRuntimeExports.jsx(a.FormRow,{label:"Name",children:i.jsxRuntimeExports.jsx(a.LockedInput,{value:t.name,disabled:!E,onSubmit:e=>y("name",e),label:"name"})},"name"),!d.includes("scope")&&i.jsxRuntimeExports.jsx(a.FormRow,{label:"Scope",children:i.jsxRuntimeExports.jsx(a.Dropdown,{options:B,disabled:t.builtin,value:t.scope||[],onChange:e=>y("scope",e),multiSelect:!0,widthExpand:!0})}),!d.includes("type")&&i.jsxRuntimeExports.jsx(a.FormRow,{label:"Type",children:i.jsxRuntimeExports.jsx(a.Dropdown,{value:[(N=t==null?void 0:t.data)==null?void 0:N.type],disabled:t.builtin,options:Object.values(S),onChange:e=>h("type",e[0]),minSelected:1,widthExpand:!0})}),R.map(e=>{var m,L;if(d.includes(e))return null;let s=null,n=T.upperFirst(e);if(e==="enum"||e==="inherit"){const o=C[e];s=o(t==null?void 0:t.data[e],v=>h(e,v))}else if(e==="default"&&((m=t==null?void 0:t.data)==null?void 0:m.type)==="boolean")s=C.booleanDefault(t==null?void 0:t.data[e],o=>h(e,o));else if(["ge","gt","le","lt"].includes(e)){if(["gt","lt"].includes(e))return null;s=i.jsxRuntimeExports.jsx(P.MinMaxField,{value:t==null?void 0:t.data,isMin:e==="ge",isFloat:((L=t==null?void 0:t.data)==null?void 0:L.type)==="float",onChange:o=>{const v=o.ge!==void 0?Number(o.ge):void 0,f=o.le!==void 0?Number(o.le):void 0;o.ge!==void 0&&isNaN(v)||o.le!==void 0&&isNaN(f)||b(x=>{if(!x||!x.data)return x;const _={...x.data,...o};return{...x,data:_}})}}),n=e==="ge"?"Min":"Max"}else{const o=v=>{const f=v.target.value;switch(e){case"minLength":case"maxLength":case"minItems":case"maxItems":{const x=parseInt(f,10);h(e,isNaN(x)?void 0:x);break}default:h(e,f);break}};s=i.jsxRuntimeExports.jsx(a.InputText,{value:String((t==null?void 0:t.data[e])??""),onChange:o})}return i.jsxRuntimeExports.jsx(a.FormRow,{label:n,style:{alignItems:"flex-start"},children:s},e)}),i.jsxRuntimeExports.jsx("span",{children:(j||l)&&i.jsxRuntimeExports.jsx("span",{className:"form-error-text",children:j||l})})]})})};exports.AttributeEditor=J;
|
|
2
2
|
//# sourceMappingURL=AttributeEditor.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttributeEditor.cjs.js","sources":["../../../../../src/components/AttributeEditor/AttributeEditor.tsx"],"sourcesContent":["import { FC, useEffect, useState } from 'react'\nimport {\n SaveButton,\n Spacer,\n FormLayout,\n FormRow,\n InputText,\n InputSwitch,\n LockedInput,\n Dropdown,\n Dialog,\n Button,\n} from '@ynput/ayon-react-components'\nimport { camelCase, upperFirst } from 'lodash'\nimport { MinMaxField } from './components'\nimport { EnumEditor } from '@shared/components/EnumEditor'\nimport { AttributeData, AttributeModel, AttributeEnumItem } from '@shared/api'\n\nconst SCOPE_OPTIONS = [\n { value: 'project', label: 'Project' },\n { value: 'folder', label: 'Folder' },\n { value: 'task', label: 'Task' },\n { value: 'product', label: 'Product' },\n { value: 'version', label: 'Version' },\n { value: 'representation', label: 'Representation' },\n { value: 'user', label: 'User' },\n]\n\n// Define types for constants\ninterface GlobalFieldEntry {\n value: keyof AttributeData\n scope: (AttributeModel['scope'] | '')[] | null\n}\n\nconst GLOBAL_FIELDS: GlobalFieldEntry[] = [\n { value: 'description', scope: null },\n { value: 'example', scope: null },\n // @ts-expect-error - project is not a scope?\n { value: 'default', scope: ['project'] },\n { value: 'inherit', scope: null },\n]\n\ninterface TypeOptionDef {\n value: AttributeData['type']\n label: string\n fields: (keyof AttributeData)[]\n exclude?: (keyof AttributeData)[]\n}\n\ninterface TypeOptionsMap {\n [key: string]: TypeOptionDef\n}\n\nconst TYPE_OPTIONS: TypeOptionsMap = {\n string: {\n value: 'string',\n label: 'String',\n fields: ['minLength', 'maxLength', 'enum', 'regex'],\n },\n integer: {\n value: 'integer',\n label: 'Integer',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n float: {\n value: 'float',\n label: 'Decimal number',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n list_of_strings: {\n value: 'list_of_strings',\n label: 'List Of Strings',\n fields: ['minItems', 'maxItems', 'enum'],\n },\n boolean: {\n value: 'boolean',\n label: 'Boolean',\n fields: [],\n exclude: ['example'],\n },\n}\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\nexport type AttributeForm = PartialBy<AttributeModel, 'scope' | 'position'>\ntype Excludes = (keyof Omit<AttributeModel, 'data'> | keyof AttributeData)[]\n\nconst initFormData: AttributeForm = {\n name: '',\n scope: ['folder', 'task'],\n builtin: false,\n position: 0,\n data: {\n type: 'string',\n title: '',\n description: '',\n example: '',\n default: undefined,\n enum: undefined,\n minLength: undefined,\n maxLength: undefined,\n regex: '',\n minItems: undefined,\n maxItems: undefined,\n ge: undefined,\n gt: undefined,\n le: undefined,\n lt: undefined,\n },\n}\n\n// build the form data based on excludes and to update any data\nconst buildInitFormData = (excludes: Excludes, data?: Partial<AttributeForm>) => {\n // Create a deep clone of init form data\n const formData = JSON.parse(JSON.stringify(initFormData)) as AttributeForm\n\n // Filter out top-level excludes if not in required\n const required = ['name']\n Object.keys(formData).forEach((key) => {\n if (\n !required.includes(key) &&\n excludes.includes(key as keyof Omit<AttributeModel, 'data'>) &&\n key !== 'data'\n ) {\n delete formData[key as keyof AttributeForm]\n }\n })\n\n // Filter out data field excludes if not in in required\n const requiredData = ['title']\n if (formData.data) {\n Object.keys(formData.data).forEach((key) => {\n if (!requiredData.includes(key) && excludes.includes(key as keyof AttributeData)) {\n delete formData.data[key as keyof AttributeData]\n }\n })\n }\n\n // Merge with provided data if any\n if (data) {\n // Merge top-level fields\n Object.keys(data).forEach((key) => {\n const typedKey = key as keyof AttributeForm\n if (typedKey !== 'data' && excludes.includes(typedKey)) return\n\n if (typedKey === 'data' && data.data && formData.data) {\n // Deep merge of data fields\n formData.data = { ...formData.data, ...data.data }\n } else if (data[typedKey] !== undefined) {\n // @ts-ignore - We know these properties exist\n formData[typedKey] = data[typedKey]\n }\n })\n }\n\n return formData\n}\n\nexport interface AttributeEditorProps {\n attribute: AttributeForm | null\n existingNames: string[]\n error?: string\n isUpdating?: boolean\n excludes?: Excludes\n onHide: () => void\n onEdit: (attribute: AttributeForm) => void\n onDelete?: () => void\n}\n\nexport const AttributeEditor: FC<AttributeEditorProps> = ({\n attribute,\n existingNames,\n error = '',\n isUpdating,\n excludes = [],\n onHide,\n onEdit,\n onDelete,\n}) => {\n const initForm = buildInitFormData(excludes, { position: existingNames.length })\n const [formData, setFormData] = useState<AttributeForm | null>(attribute || initForm)\n\n useEffect(() => {\n if (!!attribute) setFormData(attribute)\n }, [attribute])\n\n const isNew = !attribute\n\n // const setTopLevelData = (key: string, value: string) => {\n const setTopLevelData = <K extends keyof Omit<AttributeModel, 'data'>>(\n key: K,\n value: AttributeModel[K],\n ) => {\n setFormData((d) => {\n if (!d) {\n return d\n }\n return { ...d, [key]: value }\n })\n }\n\n // const setData = (key, value) => {\n const setData = <K extends keyof AttributeData>(key: K, value: AttributeData[K]) => {\n setFormData((d) => {\n // Add a check for d and d.data\n if (!d || !d.data) {\n return d\n }\n const dt = { ...d.data, [key]: value }\n return { ...d, data: dt }\n })\n }\n\n let internalError = ''\n if (formData) {\n if (isNew) {\n if (existingNames.includes(formData.name)) internalError = 'This attribute already exists'\n else if (!formData.name.match('^[a-zA-Z_]{2,64}$')) error = 'Invalid attribute name'\n } // name validation\n }\n\n const handleSubmit = () => {\n if (formData) {\n onEdit(formData)\n }\n }\n\n const footer = (\n <div style={{ display: 'flex', width: '100%', flexDirection: 'row' }}>\n {onDelete && attribute && (\n <Button\n variant=\"danger\"\n label={'Delete attribute'}\n icon={'delete'}\n disabled={isUpdating}\n onClick={onDelete}\n />\n )}\n <Spacer />\n <SaveButton\n label={isNew ? 'Create Attribute' : 'Save Attribute'}\n icon={'check'}\n disabled={!!internalError || !formData}\n active={!internalError && !!formData}\n saving={isUpdating}\n onClick={handleSubmit}\n />\n </div>\n )\n\n let dataFields: (keyof AttributeData)[] = []\n\n // add global fields, only if scope are null (all) or the scope is included\n GLOBAL_FIELDS.forEach((globalField) => {\n // @ts-expect-error - project scope will never be found here?\n if (!globalField?.scope || globalField?.scope?.some((s) => formData?.scope?.includes(s))) {\n dataFields.push(globalField.value)\n }\n })\n\n if (formData?.data.type && TYPE_OPTIONS[formData.data.type]) {\n const typeOpt = TYPE_OPTIONS[formData.data.type]\n dataFields = [...dataFields, ...typeOpt.fields].filter((f) => !typeOpt.exclude?.includes(f))\n }\n\n type CustomFieldRenderer = (value: any, onChange: (newValue: any) => void) => JSX.Element | null\n const customFields: {\n enum: CustomFieldRenderer\n inherit: CustomFieldRenderer\n booleanDefault: CustomFieldRenderer\n } = {\n enum: (value = [], onChange) => (\n <EnumEditor\n values={value as AttributeEnumItem[]}\n onChange={(val) => {\n onChange(val?.length ? val : undefined)\n }}\n />\n ),\n inherit: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n booleanDefault: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n }\n\n const handleTitleChange = (e: React.ChangeEvent) => {\n const v = (e.target as HTMLInputElement).value\n setData('title', v)\n\n if (isNew) {\n setTopLevelData('name', camelCase(v))\n }\n }\n\n return (\n <Dialog\n header={formData?.data?.title || formData?.name || 'New attribute'}\n footer={footer}\n onClose={onHide}\n isOpen={true}\n style={{ width: 700, zIndex: 999 }}\n size=\"full\"\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n handleSubmit()\n }\n }}\n >\n {formData && (\n <FormLayout>\n {!excludes.includes('title') && (\n <FormRow label={'Title'} key={'title'}>\n <InputText value={formData?.data['title']} onChange={handleTitleChange} autoFocus />\n </FormRow>\n )}\n {!excludes.includes('name') && (\n <FormRow label={'Name'} key={'name'}>\n <LockedInput\n value={formData.name}\n disabled={!isNew}\n onSubmit={(v) => setTopLevelData('name', v)}\n label=\"name\"\n />\n </FormRow>\n )}\n {!excludes.includes('scope') && (\n <FormRow label=\"Scope\">\n <Dropdown\n options={SCOPE_OPTIONS}\n disabled={formData.builtin}\n value={formData.scope || []}\n onChange={(v) => setTopLevelData('scope', v as AttributeModel['scope'])}\n multiSelect\n widthExpand\n />\n </FormRow>\n )}\n {!excludes.includes('type') && (\n <FormRow label=\"Type\">\n <Dropdown\n value={[formData?.data?.type]}\n disabled={formData.builtin}\n options={Object.values(TYPE_OPTIONS)}\n onChange={(v) => setData('type', v[0] as AttributeData['type'])}\n minSelected={1}\n widthExpand\n />\n </FormRow>\n )}\n {dataFields.map((field) => {\n // skip if field is excluded\n if (excludes.includes(field)) return null\n\n let fieldComp = null\n let fieldLabel = upperFirst(field)\n\n if (field === 'enum' || field === 'inherit') {\n const renderer = customFields[field as 'enum' | 'inherit']\n fieldComp = renderer(formData?.data[field], (value) => setData(field, value))\n } else if (field === 'default' && formData?.data?.type === 'boolean') {\n fieldComp = customFields['booleanDefault'](\n formData?.data[field] as boolean,\n (value) => setData(field, value as AttributeData['default']),\n )\n } else if (['ge', 'gt', 'le', 'lt'].includes(field)) {\n // ignore gt and lt\n if (['gt', 'lt'].includes(field)) return null\n fieldComp = (\n <MinMaxField\n value={formData?.data}\n isMin={field === 'ge'}\n isFloat={formData?.data?.type === 'float'}\n onChange={(v) => {\n const geValue = v.ge !== undefined ? Number(v.ge) : undefined\n const leValue = v.le !== undefined ? Number(v.le) : undefined\n\n if (\n // @ts-expect-error\n (v.ge !== undefined && isNaN(geValue)) ||\n // @ts-expect-error\n (v.le !== undefined && isNaN(leValue))\n ) {\n // Do not update the form if the value is not a valid number\n return\n }\n\n setFormData((d) => {\n if (!d || !d.data) return d\n const dt = { ...d.data, ...v }\n return { ...d, data: dt }\n })\n }}\n />\n )\n\n // rewrite field to min or max for display label\n fieldLabel = field === 'ge' ? 'Min' : 'Max'\n } else {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const strValue = e.target.value\n switch (field) {\n case 'minLength':\n case 'maxLength':\n case 'minItems':\n case 'maxItems': {\n const num = parseInt(strValue, 10)\n setData(field, isNaN(num) ? undefined : num)\n break\n }\n default:\n // For string fields ('description', 'regex') or 'any' type fields ('example', 'default')\n setData(field, strValue as AttributeData[typeof field])\n break\n }\n }\n\n fieldComp = (\n <InputText\n value={String(formData?.data[field] ?? '')}\n onChange={handleInputChange}\n />\n )\n }\n\n return (\n <FormRow\n label={fieldLabel}\n key={field}\n style={{\n alignItems: 'flex-start',\n }}\n >\n {fieldComp}\n </FormRow>\n )\n })}\n <span>\n {(internalError || error) && (\n <span className=\"form-error-text\">{internalError || error}</span>\n )}\n </span>\n </FormLayout>\n )}\n </Dialog>\n )\n}\n"],"names":["SCOPE_OPTIONS","GLOBAL_FIELDS","TYPE_OPTIONS","initFormData","buildInitFormData","excludes","data","formData","required","key","requiredData","typedKey","AttributeEditor","attribute","existingNames","error","isUpdating","onHide","onEdit","onDelete","initForm","setFormData","useState","useEffect","isNew","setTopLevelData","value","d","setData","dt","internalError","handleSubmit","footer","jsxs","jsx","Button","Spacer","SaveButton","dataFields","globalField","_a","s","typeOpt","f","customFields","onChange","EnumEditor","val","InputSwitch","e","handleTitleChange","v","camelCase","Dialog","FormLayout","FormRow","InputText","LockedInput","Dropdown","_b","field","fieldComp","fieldLabel","upperFirst","renderer","MinMaxField","geValue","leValue","handleInputChange","strValue","num"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AttributeEditor.cjs.js","sources":["../../../../../src/components/AttributeEditor/AttributeEditor.tsx"],"sourcesContent":["import { FC, useEffect, useState } from 'react'\nimport {\n SaveButton,\n Spacer,\n FormLayout,\n FormRow,\n InputText,\n InputSwitch,\n LockedInput,\n Dropdown,\n Dialog,\n Button,\n} from '@ynput/ayon-react-components'\nimport { camelCase, upperFirst } from 'lodash'\nimport { MinMaxField } from './components'\nimport { EnumEditor } from '@shared/components/EnumEditor'\nimport { AttributeData, AttributeModel, AttributeEnumItem } from '@shared/api'\n\nconst SCOPE_OPTIONS = [\n { value: 'project', label: 'Project' },\n { value: 'folder', label: 'Folder' },\n { value: 'task', label: 'Task' },\n { value: 'product', label: 'Product' },\n { value: 'version', label: 'Version' },\n { value: 'representation', label: 'Representation' },\n { value: 'user', label: 'User' },\n]\n\n// Define types for constants\ninterface GlobalFieldEntry {\n value: keyof AttributeData\n scope: (AttributeModel['scope'] | '')[] | null\n}\n\nconst GLOBAL_FIELDS: GlobalFieldEntry[] = [\n { value: 'description', scope: null },\n { value: 'example', scope: null },\n // @ts-expect-error - project is not a scope?\n { value: 'default', scope: ['project'] },\n { value: 'inherit', scope: null },\n]\n\ninterface TypeOptionDef {\n value: AttributeData['type']\n label: string\n fields: (keyof AttributeData)[]\n exclude?: (keyof AttributeData)[]\n}\n\ninterface TypeOptionsMap {\n [key: string]: TypeOptionDef\n}\n\nconst TYPE_OPTIONS: TypeOptionsMap = {\n string: {\n value: 'string',\n label: 'String',\n fields: ['minLength', 'maxLength', 'enum', 'regex'],\n },\n integer: {\n value: 'integer',\n label: 'Integer',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n float: {\n value: 'float',\n label: 'Decimal number',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n list_of_strings: {\n value: 'list_of_strings',\n label: 'List Of Strings',\n fields: ['minItems', 'maxItems', 'enum'],\n },\n boolean: {\n value: 'boolean',\n label: 'Boolean',\n fields: [],\n exclude: ['example'],\n },\n datetime:{\n value: 'datetime',\n label: 'Datetime',\n fields: [],\n }\n}\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\nexport type AttributeForm = PartialBy<AttributeModel, 'scope' | 'position'>\ntype Excludes = (keyof Omit<AttributeModel, 'data'> | keyof AttributeData)[]\n\nconst initFormData: AttributeForm = {\n name: '',\n scope: ['folder', 'task'],\n builtin: false,\n position: 0,\n data: {\n type: 'string',\n title: '',\n description: '',\n example: '',\n default: undefined,\n enum: undefined,\n minLength: undefined,\n maxLength: undefined,\n regex: '',\n minItems: undefined,\n maxItems: undefined,\n ge: undefined,\n gt: undefined,\n le: undefined,\n lt: undefined,\n },\n}\n\n// build the form data based on excludes and to update any data\nconst buildInitFormData = (excludes: Excludes, data?: Partial<AttributeForm>) => {\n // Create a deep clone of init form data\n const formData = JSON.parse(JSON.stringify(initFormData)) as AttributeForm\n\n // Filter out top-level excludes if not in required\n const required = ['name']\n Object.keys(formData).forEach((key) => {\n if (\n !required.includes(key) &&\n excludes.includes(key as keyof Omit<AttributeModel, 'data'>) &&\n key !== 'data'\n ) {\n delete formData[key as keyof AttributeForm]\n }\n })\n\n // Filter out data field excludes if not in in required\n const requiredData = ['title']\n if (formData.data) {\n Object.keys(formData.data).forEach((key) => {\n if (!requiredData.includes(key) && excludes.includes(key as keyof AttributeData)) {\n delete formData.data[key as keyof AttributeData]\n }\n })\n }\n\n // Merge with provided data if any\n if (data) {\n // Merge top-level fields\n Object.keys(data).forEach((key) => {\n const typedKey = key as keyof AttributeForm\n if (typedKey !== 'data' && excludes.includes(typedKey)) return\n\n if (typedKey === 'data' && data.data && formData.data) {\n // Deep merge of data fields\n formData.data = { ...formData.data, ...data.data }\n } else if (data[typedKey] !== undefined) {\n // @ts-ignore - We know these properties exist\n formData[typedKey] = data[typedKey]\n }\n })\n }\n\n return formData\n}\n\nexport interface AttributeEditorProps {\n attribute: AttributeForm | null\n existingNames: string[]\n error?: string\n isUpdating?: boolean\n excludes?: Excludes\n onHide: () => void\n onEdit: (attribute: AttributeForm) => void\n onDelete?: () => void\n}\n\nexport const AttributeEditor: FC<AttributeEditorProps> = ({\n attribute,\n existingNames,\n error = '',\n isUpdating,\n excludes = [],\n onHide,\n onEdit,\n onDelete,\n}) => {\n const initForm = buildInitFormData(excludes, { position: existingNames.length })\n const [formData, setFormData] = useState<AttributeForm | null>(attribute || initForm)\n\n useEffect(() => {\n if (!!attribute) setFormData(attribute)\n }, [attribute])\n\n const isNew = !attribute\n\n // const setTopLevelData = (key: string, value: string) => {\n const setTopLevelData = <K extends keyof Omit<AttributeModel, 'data'>>(\n key: K,\n value: AttributeModel[K],\n ) => {\n setFormData((d) => {\n if (!d) {\n return d\n }\n return { ...d, [key]: value }\n })\n }\n\n // const setData = (key, value) => {\n const setData = <K extends keyof AttributeData>(key: K, value: AttributeData[K]) => {\n setFormData((d) => {\n // Add a check for d and d.data\n if (!d || !d.data) {\n return d\n }\n const dt = { ...d.data, [key]: value }\n return { ...d, data: dt }\n })\n }\n\n let internalError = ''\n if (formData) {\n if (isNew) {\n if (existingNames.includes(formData.name)) internalError = 'This attribute already exists'\n else if (!formData.name.match('^[a-zA-Z_]{2,64}$')) error = 'Invalid attribute name'\n } // name validation\n }\n\n const handleSubmit = () => {\n if (formData) {\n onEdit(formData)\n }\n }\n\n const footer = (\n <div style={{ display: 'flex', width: '100%', flexDirection: 'row' }}>\n {onDelete && attribute && (\n <Button\n variant=\"danger\"\n label={'Delete attribute'}\n icon={'delete'}\n disabled={isUpdating}\n onClick={onDelete}\n />\n )}\n <Spacer />\n <SaveButton\n label={isNew ? 'Create Attribute' : 'Save Attribute'}\n icon={'check'}\n disabled={!!internalError || !formData}\n active={!internalError && !!formData}\n saving={isUpdating}\n onClick={handleSubmit}\n />\n </div>\n )\n\n let dataFields: (keyof AttributeData)[] = []\n\n // add global fields, only if scope are null (all) or the scope is included\n GLOBAL_FIELDS.forEach((globalField) => {\n // @ts-expect-error - project scope will never be found here?\n if (!globalField?.scope || globalField?.scope?.some((s) => formData?.scope?.includes(s))) {\n dataFields.push(globalField.value)\n }\n })\n\n if (formData?.data.type && TYPE_OPTIONS[formData.data.type]) {\n const typeOpt = TYPE_OPTIONS[formData.data.type]\n dataFields = [...dataFields, ...typeOpt.fields].filter((f) => !typeOpt.exclude?.includes(f))\n }\n\n type CustomFieldRenderer = (value: any, onChange: (newValue: any) => void) => JSX.Element | null\n const customFields: {\n enum: CustomFieldRenderer\n inherit: CustomFieldRenderer\n booleanDefault: CustomFieldRenderer\n } = {\n enum: (value = [], onChange) => (\n <EnumEditor\n values={value as AttributeEnumItem[]}\n onChange={(val) => {\n onChange(val?.length ? val : undefined)\n }}\n />\n ),\n inherit: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n booleanDefault: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n }\n\n const handleTitleChange = (e: React.ChangeEvent) => {\n const v = (e.target as HTMLInputElement).value\n setData('title', v)\n\n if (isNew) {\n setTopLevelData('name', camelCase(v))\n }\n }\n\n return (\n <Dialog\n header={formData?.data?.title || formData?.name || 'New attribute'}\n footer={footer}\n onClose={onHide}\n isOpen={true}\n style={{ width: 700, zIndex: 999 }}\n size=\"full\"\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n handleSubmit()\n }\n }}\n >\n {formData && (\n <FormLayout>\n {!excludes.includes('title') && (\n <FormRow label={'Title'} key={'title'}>\n <InputText value={formData?.data['title']} onChange={handleTitleChange} autoFocus />\n </FormRow>\n )}\n {!excludes.includes('name') && (\n <FormRow label={'Name'} key={'name'}>\n <LockedInput\n value={formData.name}\n disabled={!isNew}\n onSubmit={(v) => setTopLevelData('name', v)}\n label=\"name\"\n />\n </FormRow>\n )}\n {!excludes.includes('scope') && (\n <FormRow label=\"Scope\">\n <Dropdown\n options={SCOPE_OPTIONS}\n disabled={formData.builtin}\n value={formData.scope || []}\n onChange={(v) => setTopLevelData('scope', v as AttributeModel['scope'])}\n multiSelect\n widthExpand\n />\n </FormRow>\n )}\n {!excludes.includes('type') && (\n <FormRow label=\"Type\">\n <Dropdown\n value={[formData?.data?.type]}\n disabled={formData.builtin}\n options={Object.values(TYPE_OPTIONS)}\n onChange={(v) => setData('type', v[0] as AttributeData['type'])}\n minSelected={1}\n widthExpand\n />\n </FormRow>\n )}\n {dataFields.map((field) => {\n // skip if field is excluded\n if (excludes.includes(field)) return null\n\n let fieldComp = null\n let fieldLabel = upperFirst(field)\n\n if (field === 'enum' || field === 'inherit') {\n const renderer = customFields[field as 'enum' | 'inherit']\n fieldComp = renderer(formData?.data[field], (value) => setData(field, value))\n } else if (field === 'default' && formData?.data?.type === 'boolean') {\n fieldComp = customFields['booleanDefault'](\n formData?.data[field] as boolean,\n (value) => setData(field, value as AttributeData['default']),\n )\n } else if (['ge', 'gt', 'le', 'lt'].includes(field)) {\n // ignore gt and lt\n if (['gt', 'lt'].includes(field)) return null\n fieldComp = (\n <MinMaxField\n value={formData?.data}\n isMin={field === 'ge'}\n isFloat={formData?.data?.type === 'float'}\n onChange={(v) => {\n const geValue = v.ge !== undefined ? Number(v.ge) : undefined\n const leValue = v.le !== undefined ? Number(v.le) : undefined\n\n if (\n // @ts-expect-error\n (v.ge !== undefined && isNaN(geValue)) ||\n // @ts-expect-error\n (v.le !== undefined && isNaN(leValue))\n ) {\n // Do not update the form if the value is not a valid number\n return\n }\n\n setFormData((d) => {\n if (!d || !d.data) return d\n const dt = { ...d.data, ...v }\n return { ...d, data: dt }\n })\n }}\n />\n )\n\n // rewrite field to min or max for display label\n fieldLabel = field === 'ge' ? 'Min' : 'Max'\n } else {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const strValue = e.target.value\n switch (field) {\n case 'minLength':\n case 'maxLength':\n case 'minItems':\n case 'maxItems': {\n const num = parseInt(strValue, 10)\n setData(field, isNaN(num) ? undefined : num)\n break\n }\n default:\n // For string fields ('description', 'regex') or 'any' type fields ('example', 'default')\n setData(field, strValue as AttributeData[typeof field])\n break\n }\n }\n\n fieldComp = (\n <InputText\n value={String(formData?.data[field] ?? '')}\n onChange={handleInputChange}\n />\n )\n }\n\n return (\n <FormRow\n label={fieldLabel}\n key={field}\n style={{\n alignItems: 'flex-start',\n }}\n >\n {fieldComp}\n </FormRow>\n )\n })}\n <span>\n {(internalError || error) && (\n <span className=\"form-error-text\">{internalError || error}</span>\n )}\n </span>\n </FormLayout>\n )}\n </Dialog>\n )\n}\n"],"names":["SCOPE_OPTIONS","GLOBAL_FIELDS","TYPE_OPTIONS","initFormData","buildInitFormData","excludes","data","formData","required","key","requiredData","typedKey","AttributeEditor","attribute","existingNames","error","isUpdating","onHide","onEdit","onDelete","initForm","setFormData","useState","useEffect","isNew","setTopLevelData","value","d","setData","dt","internalError","handleSubmit","footer","jsxs","jsx","Button","Spacer","SaveButton","dataFields","globalField","_a","s","typeOpt","f","customFields","onChange","EnumEditor","val","InputSwitch","e","handleTitleChange","v","camelCase","Dialog","FormLayout","FormRow","InputText","LockedInput","Dropdown","_b","field","fieldComp","fieldLabel","upperFirst","renderer","MinMaxField","geValue","leValue","handleInputChange","strValue","num"],"mappings":"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"}
|
|
@@ -45,6 +45,11 @@ const U = [
|
|
|
45
45
|
label: "Boolean",
|
|
46
46
|
fields: [],
|
|
47
47
|
exclude: ["example"]
|
|
48
|
+
},
|
|
49
|
+
datetime: {
|
|
50
|
+
value: "datetime",
|
|
51
|
+
label: "Datetime",
|
|
52
|
+
fields: []
|
|
48
53
|
}
|
|
49
54
|
}, X = {
|
|
50
55
|
name: "",
|
|
@@ -91,14 +96,14 @@ const U = [
|
|
|
91
96
|
onDelete: E
|
|
92
97
|
}) => {
|
|
93
98
|
var L, k;
|
|
94
|
-
const A = D(c, { position: u.length }), [t,
|
|
99
|
+
const A = D(c, { position: u.length }), [t, f] = K(r || A);
|
|
95
100
|
V(() => {
|
|
96
|
-
r &&
|
|
101
|
+
r && f(r);
|
|
97
102
|
}, [r]);
|
|
98
|
-
const
|
|
99
|
-
|
|
103
|
+
const j = !r, S = (e, a) => {
|
|
104
|
+
f((n) => n && { ...n, [e]: a });
|
|
100
105
|
}, h = (e, a) => {
|
|
101
|
-
|
|
106
|
+
f((n) => {
|
|
102
107
|
if (!n || !n.data)
|
|
103
108
|
return n;
|
|
104
109
|
const m = { ...n.data, [e]: a };
|
|
@@ -106,7 +111,7 @@ const U = [
|
|
|
106
111
|
});
|
|
107
112
|
};
|
|
108
113
|
let v = "";
|
|
109
|
-
t &&
|
|
114
|
+
t && j && (u.includes(t.name) ? v = "This attribute already exists" : t.name.match("^[a-zA-Z_]{2,64}$") || (s = "Invalid attribute name"));
|
|
110
115
|
const N = () => {
|
|
111
116
|
t && d(t);
|
|
112
117
|
}, M = /* @__PURE__ */ i.jsxs("div", { style: { display: "flex", width: "100%", flexDirection: "row" }, children: [
|
|
@@ -124,7 +129,7 @@ const U = [
|
|
|
124
129
|
/* @__PURE__ */ i.jsx(
|
|
125
130
|
Y,
|
|
126
131
|
{
|
|
127
|
-
label:
|
|
132
|
+
label: j ? "Create Attribute" : "Save Attribute",
|
|
128
133
|
icon: "check",
|
|
129
134
|
disabled: !!v || !t,
|
|
130
135
|
active: !v && !!t,
|
|
@@ -173,7 +178,7 @@ const U = [
|
|
|
173
178
|
)
|
|
174
179
|
}, B = (e) => {
|
|
175
180
|
const a = e.target.value;
|
|
176
|
-
h("title", a),
|
|
181
|
+
h("title", a), j && S("name", $(a));
|
|
177
182
|
};
|
|
178
183
|
return /* @__PURE__ */ i.jsx(
|
|
179
184
|
z,
|
|
@@ -193,7 +198,7 @@ const U = [
|
|
|
193
198
|
q,
|
|
194
199
|
{
|
|
195
200
|
value: t.name,
|
|
196
|
-
disabled: !
|
|
201
|
+
disabled: !j,
|
|
197
202
|
onSubmit: (e) => S("name", e),
|
|
198
203
|
label: "name"
|
|
199
204
|
}
|
|
@@ -244,7 +249,7 @@ const U = [
|
|
|
244
249
|
const g = l.ge !== void 0 ? Number(l.ge) : void 0, I = l.le !== void 0 ? Number(l.le) : void 0;
|
|
245
250
|
// @ts-expect-error
|
|
246
251
|
l.ge !== void 0 && isNaN(g) || // @ts-expect-error
|
|
247
|
-
l.le !== void 0 && isNaN(I) ||
|
|
252
|
+
l.le !== void 0 && isNaN(I) || f((p) => {
|
|
248
253
|
if (!p || !p.data) return p;
|
|
249
254
|
const F = { ...p.data, ...l };
|
|
250
255
|
return { ...p, data: F };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttributeEditor.es.js","sources":["../../../../../src/components/AttributeEditor/AttributeEditor.tsx"],"sourcesContent":["import { FC, useEffect, useState } from 'react'\nimport {\n SaveButton,\n Spacer,\n FormLayout,\n FormRow,\n InputText,\n InputSwitch,\n LockedInput,\n Dropdown,\n Dialog,\n Button,\n} from '@ynput/ayon-react-components'\nimport { camelCase, upperFirst } from 'lodash'\nimport { MinMaxField } from './components'\nimport { EnumEditor } from '@shared/components/EnumEditor'\nimport { AttributeData, AttributeModel, AttributeEnumItem } from '@shared/api'\n\nconst SCOPE_OPTIONS = [\n { value: 'project', label: 'Project' },\n { value: 'folder', label: 'Folder' },\n { value: 'task', label: 'Task' },\n { value: 'product', label: 'Product' },\n { value: 'version', label: 'Version' },\n { value: 'representation', label: 'Representation' },\n { value: 'user', label: 'User' },\n]\n\n// Define types for constants\ninterface GlobalFieldEntry {\n value: keyof AttributeData\n scope: (AttributeModel['scope'] | '')[] | null\n}\n\nconst GLOBAL_FIELDS: GlobalFieldEntry[] = [\n { value: 'description', scope: null },\n { value: 'example', scope: null },\n // @ts-expect-error - project is not a scope?\n { value: 'default', scope: ['project'] },\n { value: 'inherit', scope: null },\n]\n\ninterface TypeOptionDef {\n value: AttributeData['type']\n label: string\n fields: (keyof AttributeData)[]\n exclude?: (keyof AttributeData)[]\n}\n\ninterface TypeOptionsMap {\n [key: string]: TypeOptionDef\n}\n\nconst TYPE_OPTIONS: TypeOptionsMap = {\n string: {\n value: 'string',\n label: 'String',\n fields: ['minLength', 'maxLength', 'enum', 'regex'],\n },\n integer: {\n value: 'integer',\n label: 'Integer',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n float: {\n value: 'float',\n label: 'Decimal number',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n list_of_strings: {\n value: 'list_of_strings',\n label: 'List Of Strings',\n fields: ['minItems', 'maxItems', 'enum'],\n },\n boolean: {\n value: 'boolean',\n label: 'Boolean',\n fields: [],\n exclude: ['example'],\n },\n}\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\nexport type AttributeForm = PartialBy<AttributeModel, 'scope' | 'position'>\ntype Excludes = (keyof Omit<AttributeModel, 'data'> | keyof AttributeData)[]\n\nconst initFormData: AttributeForm = {\n name: '',\n scope: ['folder', 'task'],\n builtin: false,\n position: 0,\n data: {\n type: 'string',\n title: '',\n description: '',\n example: '',\n default: undefined,\n enum: undefined,\n minLength: undefined,\n maxLength: undefined,\n regex: '',\n minItems: undefined,\n maxItems: undefined,\n ge: undefined,\n gt: undefined,\n le: undefined,\n lt: undefined,\n },\n}\n\n// build the form data based on excludes and to update any data\nconst buildInitFormData = (excludes: Excludes, data?: Partial<AttributeForm>) => {\n // Create a deep clone of init form data\n const formData = JSON.parse(JSON.stringify(initFormData)) as AttributeForm\n\n // Filter out top-level excludes if not in required\n const required = ['name']\n Object.keys(formData).forEach((key) => {\n if (\n !required.includes(key) &&\n excludes.includes(key as keyof Omit<AttributeModel, 'data'>) &&\n key !== 'data'\n ) {\n delete formData[key as keyof AttributeForm]\n }\n })\n\n // Filter out data field excludes if not in in required\n const requiredData = ['title']\n if (formData.data) {\n Object.keys(formData.data).forEach((key) => {\n if (!requiredData.includes(key) && excludes.includes(key as keyof AttributeData)) {\n delete formData.data[key as keyof AttributeData]\n }\n })\n }\n\n // Merge with provided data if any\n if (data) {\n // Merge top-level fields\n Object.keys(data).forEach((key) => {\n const typedKey = key as keyof AttributeForm\n if (typedKey !== 'data' && excludes.includes(typedKey)) return\n\n if (typedKey === 'data' && data.data && formData.data) {\n // Deep merge of data fields\n formData.data = { ...formData.data, ...data.data }\n } else if (data[typedKey] !== undefined) {\n // @ts-ignore - We know these properties exist\n formData[typedKey] = data[typedKey]\n }\n })\n }\n\n return formData\n}\n\nexport interface AttributeEditorProps {\n attribute: AttributeForm | null\n existingNames: string[]\n error?: string\n isUpdating?: boolean\n excludes?: Excludes\n onHide: () => void\n onEdit: (attribute: AttributeForm) => void\n onDelete?: () => void\n}\n\nexport const AttributeEditor: FC<AttributeEditorProps> = ({\n attribute,\n existingNames,\n error = '',\n isUpdating,\n excludes = [],\n onHide,\n onEdit,\n onDelete,\n}) => {\n const initForm = buildInitFormData(excludes, { position: existingNames.length })\n const [formData, setFormData] = useState<AttributeForm | null>(attribute || initForm)\n\n useEffect(() => {\n if (!!attribute) setFormData(attribute)\n }, [attribute])\n\n const isNew = !attribute\n\n // const setTopLevelData = (key: string, value: string) => {\n const setTopLevelData = <K extends keyof Omit<AttributeModel, 'data'>>(\n key: K,\n value: AttributeModel[K],\n ) => {\n setFormData((d) => {\n if (!d) {\n return d\n }\n return { ...d, [key]: value }\n })\n }\n\n // const setData = (key, value) => {\n const setData = <K extends keyof AttributeData>(key: K, value: AttributeData[K]) => {\n setFormData((d) => {\n // Add a check for d and d.data\n if (!d || !d.data) {\n return d\n }\n const dt = { ...d.data, [key]: value }\n return { ...d, data: dt }\n })\n }\n\n let internalError = ''\n if (formData) {\n if (isNew) {\n if (existingNames.includes(formData.name)) internalError = 'This attribute already exists'\n else if (!formData.name.match('^[a-zA-Z_]{2,64}$')) error = 'Invalid attribute name'\n } // name validation\n }\n\n const handleSubmit = () => {\n if (formData) {\n onEdit(formData)\n }\n }\n\n const footer = (\n <div style={{ display: 'flex', width: '100%', flexDirection: 'row' }}>\n {onDelete && attribute && (\n <Button\n variant=\"danger\"\n label={'Delete attribute'}\n icon={'delete'}\n disabled={isUpdating}\n onClick={onDelete}\n />\n )}\n <Spacer />\n <SaveButton\n label={isNew ? 'Create Attribute' : 'Save Attribute'}\n icon={'check'}\n disabled={!!internalError || !formData}\n active={!internalError && !!formData}\n saving={isUpdating}\n onClick={handleSubmit}\n />\n </div>\n )\n\n let dataFields: (keyof AttributeData)[] = []\n\n // add global fields, only if scope are null (all) or the scope is included\n GLOBAL_FIELDS.forEach((globalField) => {\n // @ts-expect-error - project scope will never be found here?\n if (!globalField?.scope || globalField?.scope?.some((s) => formData?.scope?.includes(s))) {\n dataFields.push(globalField.value)\n }\n })\n\n if (formData?.data.type && TYPE_OPTIONS[formData.data.type]) {\n const typeOpt = TYPE_OPTIONS[formData.data.type]\n dataFields = [...dataFields, ...typeOpt.fields].filter((f) => !typeOpt.exclude?.includes(f))\n }\n\n type CustomFieldRenderer = (value: any, onChange: (newValue: any) => void) => JSX.Element | null\n const customFields: {\n enum: CustomFieldRenderer\n inherit: CustomFieldRenderer\n booleanDefault: CustomFieldRenderer\n } = {\n enum: (value = [], onChange) => (\n <EnumEditor\n values={value as AttributeEnumItem[]}\n onChange={(val) => {\n onChange(val?.length ? val : undefined)\n }}\n />\n ),\n inherit: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n booleanDefault: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n }\n\n const handleTitleChange = (e: React.ChangeEvent) => {\n const v = (e.target as HTMLInputElement).value\n setData('title', v)\n\n if (isNew) {\n setTopLevelData('name', camelCase(v))\n }\n }\n\n return (\n <Dialog\n header={formData?.data?.title || formData?.name || 'New attribute'}\n footer={footer}\n onClose={onHide}\n isOpen={true}\n style={{ width: 700, zIndex: 999 }}\n size=\"full\"\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n handleSubmit()\n }\n }}\n >\n {formData && (\n <FormLayout>\n {!excludes.includes('title') && (\n <FormRow label={'Title'} key={'title'}>\n <InputText value={formData?.data['title']} onChange={handleTitleChange} autoFocus />\n </FormRow>\n )}\n {!excludes.includes('name') && (\n <FormRow label={'Name'} key={'name'}>\n <LockedInput\n value={formData.name}\n disabled={!isNew}\n onSubmit={(v) => setTopLevelData('name', v)}\n label=\"name\"\n />\n </FormRow>\n )}\n {!excludes.includes('scope') && (\n <FormRow label=\"Scope\">\n <Dropdown\n options={SCOPE_OPTIONS}\n disabled={formData.builtin}\n value={formData.scope || []}\n onChange={(v) => setTopLevelData('scope', v as AttributeModel['scope'])}\n multiSelect\n widthExpand\n />\n </FormRow>\n )}\n {!excludes.includes('type') && (\n <FormRow label=\"Type\">\n <Dropdown\n value={[formData?.data?.type]}\n disabled={formData.builtin}\n options={Object.values(TYPE_OPTIONS)}\n onChange={(v) => setData('type', v[0] as AttributeData['type'])}\n minSelected={1}\n widthExpand\n />\n </FormRow>\n )}\n {dataFields.map((field) => {\n // skip if field is excluded\n if (excludes.includes(field)) return null\n\n let fieldComp = null\n let fieldLabel = upperFirst(field)\n\n if (field === 'enum' || field === 'inherit') {\n const renderer = customFields[field as 'enum' | 'inherit']\n fieldComp = renderer(formData?.data[field], (value) => setData(field, value))\n } else if (field === 'default' && formData?.data?.type === 'boolean') {\n fieldComp = customFields['booleanDefault'](\n formData?.data[field] as boolean,\n (value) => setData(field, value as AttributeData['default']),\n )\n } else if (['ge', 'gt', 'le', 'lt'].includes(field)) {\n // ignore gt and lt\n if (['gt', 'lt'].includes(field)) return null\n fieldComp = (\n <MinMaxField\n value={formData?.data}\n isMin={field === 'ge'}\n isFloat={formData?.data?.type === 'float'}\n onChange={(v) => {\n const geValue = v.ge !== undefined ? Number(v.ge) : undefined\n const leValue = v.le !== undefined ? Number(v.le) : undefined\n\n if (\n // @ts-expect-error\n (v.ge !== undefined && isNaN(geValue)) ||\n // @ts-expect-error\n (v.le !== undefined && isNaN(leValue))\n ) {\n // Do not update the form if the value is not a valid number\n return\n }\n\n setFormData((d) => {\n if (!d || !d.data) return d\n const dt = { ...d.data, ...v }\n return { ...d, data: dt }\n })\n }}\n />\n )\n\n // rewrite field to min or max for display label\n fieldLabel = field === 'ge' ? 'Min' : 'Max'\n } else {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const strValue = e.target.value\n switch (field) {\n case 'minLength':\n case 'maxLength':\n case 'minItems':\n case 'maxItems': {\n const num = parseInt(strValue, 10)\n setData(field, isNaN(num) ? undefined : num)\n break\n }\n default:\n // For string fields ('description', 'regex') or 'any' type fields ('example', 'default')\n setData(field, strValue as AttributeData[typeof field])\n break\n }\n }\n\n fieldComp = (\n <InputText\n value={String(formData?.data[field] ?? '')}\n onChange={handleInputChange}\n />\n )\n }\n\n return (\n <FormRow\n label={fieldLabel}\n key={field}\n style={{\n alignItems: 'flex-start',\n }}\n >\n {fieldComp}\n </FormRow>\n )\n })}\n <span>\n {(internalError || error) && (\n <span className=\"form-error-text\">{internalError || error}</span>\n )}\n </span>\n </FormLayout>\n )}\n </Dialog>\n )\n}\n"],"names":["SCOPE_OPTIONS","GLOBAL_FIELDS","TYPE_OPTIONS","initFormData","buildInitFormData","excludes","data","formData","required","key","requiredData","typedKey","AttributeEditor","attribute","existingNames","error","isUpdating","onHide","onEdit","onDelete","initForm","setFormData","useState","useEffect","isNew","setTopLevelData","value","d","setData","dt","internalError","handleSubmit","footer","jsxs","jsx","Button","Spacer","SaveButton","dataFields","globalField","_a","s","typeOpt","f","customFields","onChange","EnumEditor","val","InputSwitch","e","handleTitleChange","v","camelCase","Dialog","FormLayout","FormRow","InputText","LockedInput","Dropdown","_b","field","fieldComp","fieldLabel","upperFirst","renderer","MinMaxField","geValue","leValue","handleInputChange","strValue","num"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AttributeEditor.es.js","sources":["../../../../../src/components/AttributeEditor/AttributeEditor.tsx"],"sourcesContent":["import { FC, useEffect, useState } from 'react'\nimport {\n SaveButton,\n Spacer,\n FormLayout,\n FormRow,\n InputText,\n InputSwitch,\n LockedInput,\n Dropdown,\n Dialog,\n Button,\n} from '@ynput/ayon-react-components'\nimport { camelCase, upperFirst } from 'lodash'\nimport { MinMaxField } from './components'\nimport { EnumEditor } from '@shared/components/EnumEditor'\nimport { AttributeData, AttributeModel, AttributeEnumItem } from '@shared/api'\n\nconst SCOPE_OPTIONS = [\n { value: 'project', label: 'Project' },\n { value: 'folder', label: 'Folder' },\n { value: 'task', label: 'Task' },\n { value: 'product', label: 'Product' },\n { value: 'version', label: 'Version' },\n { value: 'representation', label: 'Representation' },\n { value: 'user', label: 'User' },\n]\n\n// Define types for constants\ninterface GlobalFieldEntry {\n value: keyof AttributeData\n scope: (AttributeModel['scope'] | '')[] | null\n}\n\nconst GLOBAL_FIELDS: GlobalFieldEntry[] = [\n { value: 'description', scope: null },\n { value: 'example', scope: null },\n // @ts-expect-error - project is not a scope?\n { value: 'default', scope: ['project'] },\n { value: 'inherit', scope: null },\n]\n\ninterface TypeOptionDef {\n value: AttributeData['type']\n label: string\n fields: (keyof AttributeData)[]\n exclude?: (keyof AttributeData)[]\n}\n\ninterface TypeOptionsMap {\n [key: string]: TypeOptionDef\n}\n\nconst TYPE_OPTIONS: TypeOptionsMap = {\n string: {\n value: 'string',\n label: 'String',\n fields: ['minLength', 'maxLength', 'enum', 'regex'],\n },\n integer: {\n value: 'integer',\n label: 'Integer',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n float: {\n value: 'float',\n label: 'Decimal number',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n list_of_strings: {\n value: 'list_of_strings',\n label: 'List Of Strings',\n fields: ['minItems', 'maxItems', 'enum'],\n },\n boolean: {\n value: 'boolean',\n label: 'Boolean',\n fields: [],\n exclude: ['example'],\n },\n datetime:{\n value: 'datetime',\n label: 'Datetime',\n fields: [],\n }\n}\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\nexport type AttributeForm = PartialBy<AttributeModel, 'scope' | 'position'>\ntype Excludes = (keyof Omit<AttributeModel, 'data'> | keyof AttributeData)[]\n\nconst initFormData: AttributeForm = {\n name: '',\n scope: ['folder', 'task'],\n builtin: false,\n position: 0,\n data: {\n type: 'string',\n title: '',\n description: '',\n example: '',\n default: undefined,\n enum: undefined,\n minLength: undefined,\n maxLength: undefined,\n regex: '',\n minItems: undefined,\n maxItems: undefined,\n ge: undefined,\n gt: undefined,\n le: undefined,\n lt: undefined,\n },\n}\n\n// build the form data based on excludes and to update any data\nconst buildInitFormData = (excludes: Excludes, data?: Partial<AttributeForm>) => {\n // Create a deep clone of init form data\n const formData = JSON.parse(JSON.stringify(initFormData)) as AttributeForm\n\n // Filter out top-level excludes if not in required\n const required = ['name']\n Object.keys(formData).forEach((key) => {\n if (\n !required.includes(key) &&\n excludes.includes(key as keyof Omit<AttributeModel, 'data'>) &&\n key !== 'data'\n ) {\n delete formData[key as keyof AttributeForm]\n }\n })\n\n // Filter out data field excludes if not in in required\n const requiredData = ['title']\n if (formData.data) {\n Object.keys(formData.data).forEach((key) => {\n if (!requiredData.includes(key) && excludes.includes(key as keyof AttributeData)) {\n delete formData.data[key as keyof AttributeData]\n }\n })\n }\n\n // Merge with provided data if any\n if (data) {\n // Merge top-level fields\n Object.keys(data).forEach((key) => {\n const typedKey = key as keyof AttributeForm\n if (typedKey !== 'data' && excludes.includes(typedKey)) return\n\n if (typedKey === 'data' && data.data && formData.data) {\n // Deep merge of data fields\n formData.data = { ...formData.data, ...data.data }\n } else if (data[typedKey] !== undefined) {\n // @ts-ignore - We know these properties exist\n formData[typedKey] = data[typedKey]\n }\n })\n }\n\n return formData\n}\n\nexport interface AttributeEditorProps {\n attribute: AttributeForm | null\n existingNames: string[]\n error?: string\n isUpdating?: boolean\n excludes?: Excludes\n onHide: () => void\n onEdit: (attribute: AttributeForm) => void\n onDelete?: () => void\n}\n\nexport const AttributeEditor: FC<AttributeEditorProps> = ({\n attribute,\n existingNames,\n error = '',\n isUpdating,\n excludes = [],\n onHide,\n onEdit,\n onDelete,\n}) => {\n const initForm = buildInitFormData(excludes, { position: existingNames.length })\n const [formData, setFormData] = useState<AttributeForm | null>(attribute || initForm)\n\n useEffect(() => {\n if (!!attribute) setFormData(attribute)\n }, [attribute])\n\n const isNew = !attribute\n\n // const setTopLevelData = (key: string, value: string) => {\n const setTopLevelData = <K extends keyof Omit<AttributeModel, 'data'>>(\n key: K,\n value: AttributeModel[K],\n ) => {\n setFormData((d) => {\n if (!d) {\n return d\n }\n return { ...d, [key]: value }\n })\n }\n\n // const setData = (key, value) => {\n const setData = <K extends keyof AttributeData>(key: K, value: AttributeData[K]) => {\n setFormData((d) => {\n // Add a check for d and d.data\n if (!d || !d.data) {\n return d\n }\n const dt = { ...d.data, [key]: value }\n return { ...d, data: dt }\n })\n }\n\n let internalError = ''\n if (formData) {\n if (isNew) {\n if (existingNames.includes(formData.name)) internalError = 'This attribute already exists'\n else if (!formData.name.match('^[a-zA-Z_]{2,64}$')) error = 'Invalid attribute name'\n } // name validation\n }\n\n const handleSubmit = () => {\n if (formData) {\n onEdit(formData)\n }\n }\n\n const footer = (\n <div style={{ display: 'flex', width: '100%', flexDirection: 'row' }}>\n {onDelete && attribute && (\n <Button\n variant=\"danger\"\n label={'Delete attribute'}\n icon={'delete'}\n disabled={isUpdating}\n onClick={onDelete}\n />\n )}\n <Spacer />\n <SaveButton\n label={isNew ? 'Create Attribute' : 'Save Attribute'}\n icon={'check'}\n disabled={!!internalError || !formData}\n active={!internalError && !!formData}\n saving={isUpdating}\n onClick={handleSubmit}\n />\n </div>\n )\n\n let dataFields: (keyof AttributeData)[] = []\n\n // add global fields, only if scope are null (all) or the scope is included\n GLOBAL_FIELDS.forEach((globalField) => {\n // @ts-expect-error - project scope will never be found here?\n if (!globalField?.scope || globalField?.scope?.some((s) => formData?.scope?.includes(s))) {\n dataFields.push(globalField.value)\n }\n })\n\n if (formData?.data.type && TYPE_OPTIONS[formData.data.type]) {\n const typeOpt = TYPE_OPTIONS[formData.data.type]\n dataFields = [...dataFields, ...typeOpt.fields].filter((f) => !typeOpt.exclude?.includes(f))\n }\n\n type CustomFieldRenderer = (value: any, onChange: (newValue: any) => void) => JSX.Element | null\n const customFields: {\n enum: CustomFieldRenderer\n inherit: CustomFieldRenderer\n booleanDefault: CustomFieldRenderer\n } = {\n enum: (value = [], onChange) => (\n <EnumEditor\n values={value as AttributeEnumItem[]}\n onChange={(val) => {\n onChange(val?.length ? val : undefined)\n }}\n />\n ),\n inherit: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n booleanDefault: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n }\n\n const handleTitleChange = (e: React.ChangeEvent) => {\n const v = (e.target as HTMLInputElement).value\n setData('title', v)\n\n if (isNew) {\n setTopLevelData('name', camelCase(v))\n }\n }\n\n return (\n <Dialog\n header={formData?.data?.title || formData?.name || 'New attribute'}\n footer={footer}\n onClose={onHide}\n isOpen={true}\n style={{ width: 700, zIndex: 999 }}\n size=\"full\"\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n handleSubmit()\n }\n }}\n >\n {formData && (\n <FormLayout>\n {!excludes.includes('title') && (\n <FormRow label={'Title'} key={'title'}>\n <InputText value={formData?.data['title']} onChange={handleTitleChange} autoFocus />\n </FormRow>\n )}\n {!excludes.includes('name') && (\n <FormRow label={'Name'} key={'name'}>\n <LockedInput\n value={formData.name}\n disabled={!isNew}\n onSubmit={(v) => setTopLevelData('name', v)}\n label=\"name\"\n />\n </FormRow>\n )}\n {!excludes.includes('scope') && (\n <FormRow label=\"Scope\">\n <Dropdown\n options={SCOPE_OPTIONS}\n disabled={formData.builtin}\n value={formData.scope || []}\n onChange={(v) => setTopLevelData('scope', v as AttributeModel['scope'])}\n multiSelect\n widthExpand\n />\n </FormRow>\n )}\n {!excludes.includes('type') && (\n <FormRow label=\"Type\">\n <Dropdown\n value={[formData?.data?.type]}\n disabled={formData.builtin}\n options={Object.values(TYPE_OPTIONS)}\n onChange={(v) => setData('type', v[0] as AttributeData['type'])}\n minSelected={1}\n widthExpand\n />\n </FormRow>\n )}\n {dataFields.map((field) => {\n // skip if field is excluded\n if (excludes.includes(field)) return null\n\n let fieldComp = null\n let fieldLabel = upperFirst(field)\n\n if (field === 'enum' || field === 'inherit') {\n const renderer = customFields[field as 'enum' | 'inherit']\n fieldComp = renderer(formData?.data[field], (value) => setData(field, value))\n } else if (field === 'default' && formData?.data?.type === 'boolean') {\n fieldComp = customFields['booleanDefault'](\n formData?.data[field] as boolean,\n (value) => setData(field, value as AttributeData['default']),\n )\n } else if (['ge', 'gt', 'le', 'lt'].includes(field)) {\n // ignore gt and lt\n if (['gt', 'lt'].includes(field)) return null\n fieldComp = (\n <MinMaxField\n value={formData?.data}\n isMin={field === 'ge'}\n isFloat={formData?.data?.type === 'float'}\n onChange={(v) => {\n const geValue = v.ge !== undefined ? Number(v.ge) : undefined\n const leValue = v.le !== undefined ? Number(v.le) : undefined\n\n if (\n // @ts-expect-error\n (v.ge !== undefined && isNaN(geValue)) ||\n // @ts-expect-error\n (v.le !== undefined && isNaN(leValue))\n ) {\n // Do not update the form if the value is not a valid number\n return\n }\n\n setFormData((d) => {\n if (!d || !d.data) return d\n const dt = { ...d.data, ...v }\n return { ...d, data: dt }\n })\n }}\n />\n )\n\n // rewrite field to min or max for display label\n fieldLabel = field === 'ge' ? 'Min' : 'Max'\n } else {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const strValue = e.target.value\n switch (field) {\n case 'minLength':\n case 'maxLength':\n case 'minItems':\n case 'maxItems': {\n const num = parseInt(strValue, 10)\n setData(field, isNaN(num) ? undefined : num)\n break\n }\n default:\n // For string fields ('description', 'regex') or 'any' type fields ('example', 'default')\n setData(field, strValue as AttributeData[typeof field])\n break\n }\n }\n\n fieldComp = (\n <InputText\n value={String(formData?.data[field] ?? '')}\n onChange={handleInputChange}\n />\n )\n }\n\n return (\n <FormRow\n label={fieldLabel}\n key={field}\n style={{\n alignItems: 'flex-start',\n }}\n >\n {fieldComp}\n </FormRow>\n )\n })}\n <span>\n {(internalError || error) && (\n <span className=\"form-error-text\">{internalError || error}</span>\n )}\n </span>\n </FormLayout>\n )}\n </Dialog>\n )\n}\n"],"names":["SCOPE_OPTIONS","GLOBAL_FIELDS","TYPE_OPTIONS","initFormData","buildInitFormData","excludes","data","formData","required","key","requiredData","typedKey","AttributeEditor","attribute","existingNames","error","isUpdating","onHide","onEdit","onDelete","initForm","setFormData","useState","useEffect","isNew","setTopLevelData","value","d","setData","dt","internalError","handleSubmit","footer","jsxs","jsx","Button","Spacer","SaveButton","dataFields","globalField","_a","s","typeOpt","f","customFields","onChange","EnumEditor","val","InputSwitch","e","handleTitleChange","v","camelCase","Dialog","FormLayout","FormRow","InputText","LockedInput","Dropdown","_b","field","fieldComp","fieldLabel","upperFirst","renderer","MinMaxField","geValue","leValue","handleInputChange","strValue","num"],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";const o=require("../../../../_virtual/jsx-runtime.cjs.js"),e=require("react"),s=require("styled-components");require("../../containers/ProjectTreeTable/ProjectTreeTable.cjs.js");require("react-toastify");require("lodash");require("uuid");require("../../util/pubsub.cjs.js");require("../../containers/ProjectTreeTable/context/CellEditingContext.cjs.js");require("@ynput/ayon-react-components");require("@tanstack/react-table");require("../../containers/ProjectTreeTable/widgets/CollapsedWidget.cjs.js");require("../../containers/ProjectTreeTable/widgets/DateWidget.cjs.js");require("../../containers/ProjectTreeTable/widgets/EnumWidget.cjs.js");require("../../containers/ProjectTreeTable/widgets/TextWidget.cjs.js");require("../../containers/ProjectTreeTable/widgets/BooleanWidget.cjs.js");require("../../containers/ProjectTreeTable/widgets/CellWidget.cjs.js");require("../../containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js");require("../../containers/ProjectTreeTable/widgets/GroupHeaderWidget.cjs.js");require("../../containers/ProjectTreeTable/widgets/ThumbnailWidget.cjs.js");require("clsx");require("../ThumbnailSimple/ThumbnailSimple.cjs.js");require("../EmptyPlaceholder/EmptyPlaceholder.cjs.js");require("../EmptyPlaceholder/EmptyPlaceholderFlex.styled.cjs.js");require("../../api/base/client.cjs.js");require("../../api/generated/graphql.cjs.js");require("../../api/generated/graphqlLinks.cjs.js");require("../../api/generated/access.cjs.js");require("../../api/generated/actions.cjs.js");require("../../api/generated/activityFeed.cjs.js");require("../../api/generated/addons.cjs.js");require("../../api/generated/anatomy.cjs.js");require("../../api/generated/attributes.cjs.js");require("../../api/generated/authentication.cjs.js");require("../../api/generated/bundles.cjs.js");require("../../api/generated/configuration.cjs.js");require("../../api/generated/desktop.cjs.js");require("../../api/generated/entityLists.cjs.js");require("../../api/generated/events.cjs.js");require("../../api/generated/files.cjs.js");require("../../api/generated/folders.cjs.js");require("../../api/generated/inbox.cjs.js");require("../../api/generated/links.cjs.js");require("../../api/generated/market.cjs.js");require("../../api/generated/onboarding.cjs.js");require("../../api/generated/operations.cjs.js");require("../../api/generated/products.cjs.js");require("../../api/generated/projectDashboard.cjs.js");require("../../api/generated/projects.cjs.js");require("../../api/generated/reviewables.cjs.js");require("../../api/generated/services.cjs.js");require("../../api/generated/system.cjs.js");require("../../api/generated/tasks.cjs.js");require("../../api/generated/teams.cjs.js");require("../../api/generated/thumbnails.cjs.js");require("../../api/generated/uRIs.cjs.js");require("../../api/generated/users.cjs.js");require("../../api/generated/versions.cjs.js");require("../../api/generated/workfiles.cjs.js");require("../../api/generated/ynputCloud.cjs.js");require("../../api/generated/grouping.cjs.js");require("../../api/generated/views.cjs.js");require("../../api/queries/actions/getActions.cjs.js");require("../../api/queries/activities/getActivities.cjs.js");require("../../api/queries/activities/updateActivities.cjs.js");require("../../api/queries/activities/updateReaction.cjs.js");require("../../api/queries/activities/getMentions.cjs.js");require("../../api/queries/addons/getAddons.cjs.js");require("../../api/queries/addons/updateAddons.cjs.js");require("../../api/queries/attributes/getAttributes.cjs.js");require("../../api/queries/attributes/updateAttributes.cjs.js");require("../../api/queries/authentication/getAuthentication.cjs.js");require("../../api/queries/cloud/cloud.cjs.js");require("../../api/queries/entities/getEntity.cjs.js");require("../../api/queries/entities/getEntityPanel.cjs.js");require("../../api/queries/entities/updateEntity.cjs.js");require("../../api/queries/entityLists/getLists.cjs.js");require("../../api/queries/entityLists/updateLists.cjs.js");require("../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../api/queries/entityLists/listFolders.cjs.js");require("../../api/queries/folders/getFolders.cjs.js");require("../../api/queries/grouping/getGrouping.cjs.js");require("../../api/queries/links/updateLinks.cjs.js");require("../../api/queries/links/getLinks.cjs.js");require("../../api/queries/links/getEntityLinks.cjs.js");require("../../api/queries/overview/getOverview.cjs.js");require("../../api/queries/overview/updateOverview.cjs.js");require("../../api/queries/permissions/getPermissions.cjs.js");require("../../api/queries/products/createProduct.cjs.js");require("../../api/queries/project/getProject.cjs.js");require("../../api/queries/project/updateProject.cjs.js");require("../../api/queries/review/getReview.cjs.js");require("../../api/queries/review/updateReview.cjs.js");require("../../api/queries/share/share.cjs.js");require("../../api/queries/system/getSystem.cjs.js");require("../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../api/queries/users/getUsers.cjs.js");require("../../api/queries/users/updateUsers.cjs.js");require("../../api/queries/versions/updateVersions.cjs.js");require("../../api/queries/views/getViews.cjs.js");require("../../api/queries/views/updateViews.cjs.js");require("../../api/queries/watchers/getWatchers.cjs.js");require("@dnd-kit/core");require("@dnd-kit/sortable");require("../ReviewablesList/ReviewablesList.styled.cjs.js");require("../../containers/ContextMenu/ContextMenuContext.cjs.js");;/* empty css */require("../ReviewablesList/ReviewablesUpload.styled.cjs.js");require("axios");require("../../context/RemoteModulesContext.cjs.js");require("../../context/DetailsPanelContext.cjs.js");require("../../context/ThumbnailUploaderContext.cjs.js");require("../../context/SettingsPanelContext.cjs.js");require("../../context/pip/PiPProvider.cjs.js");require("react-dom");require("../../context/pip/PiPWrapper.cjs.js");require("../../context/AddonProjectContext.cjs.js");require("../../context/AddonContext.cjs.js");require("../../context/PowerpackContext.cjs.js");require("../../context/MoveEntityContext.cjs.js");require("../../context/MenuContext.cjs.js");require("../ReviewableCard/ReviewableCard.cjs.js");require("../ReviewableProgressCard/ReviewableProgressCard.styled.cjs.js");require("../FileThumbnail/FileThumbnail.cjs.js");require("../Thumbnail/Thumbnail.styled.cjs.js");require("../Thumbnail/StackedThumbnails.cjs.js");require("../../containers/Feed/context/FeedContext.cjs.js");require("../../containers/Feed/components/Tooltips/UserTooltip/UserTooltip.styled.cjs.js");require("../../containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.styled.cjs.js");require("../../containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js");require("../../containers/Feed/components/FileUploadPreview/Mimes/TextMime.cjs.js");require("react-markdown");require("remark-emoji");require("remark-gfm");require("remark-directive");require("remark-directive-rehype");require("../../containers/Feed/components/CommentInput/CommentInput.cjs.js");require("../../containers/Feed/components/ReactionContainer/Reactions.styled.cjs.js");require("../../containers/Feed/components/FilesGrid/FilesGrid.styled.cjs.js");require("../../containers/Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js");require("../../containers/Feed/components/CommentInput/quillToMarkdown.cjs.js");require("../../containers/Feed/components/ActivityComment/ActivityComment.styled.cjs.js");require("../../containers/Feed/components/ActivityCheckbox/ActivityCheckbox.styled.cjs.js");require("../../containers/Feed/components/ActivityReference/ActivityReference.styled.cjs.js");require("react-router-dom");require("../../containers/Feed/components/ActivityStatus/ActivityStatus.cjs.js");require("../../containers/Feed/components/ActivityHeader/ActivityHeader.styled.cjs.js");require("../../containers/Feed/components/ActivityDate.cjs.js");require("../../containers/Feed/components/ActivityStatusChange/ActivityStatusChange.styled.cjs.js");require("../../containers/Feed/components/ActivityAssigneeChange/ActivityAssigneeChange.styled.cjs.js");require("../../containers/Feed/components/ActivityVersions/ActivityVersions.styled.cjs.js");require("../../containers/Feed/components/ActivityGroup/ActivityGroup.styled.cjs.js");require("../../containers/Feed/Feed.styled.cjs.js");require("date-fns");require("../../containers/DetailsPanel/DetailsPanel.styled.cjs.js");require("../../../../_virtual/runtime.cjs.js");require("../../../../_virtual/semver.cjs.js");require("react-redux");require("custom-protocol-check");require("../../containers/DetailsPanel/FeedFilters/FeedFilters.styled.cjs.js");require("../../containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js");require("../PlayableIcon/PlayableIcon.cjs.js");require("../../containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js");require("../../containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.styled.cjs.js");require("../../containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.styled.cjs.js");require("../../containers/Actions/Actions.styled.cjs.js");require("../../containers/Actions/ActionsDropdown/ActionsDropdown.cjs.js");require("../../containers/Actions/ActionIcon.cjs.js");require("../../containers/Views/context/ViewsContext.cjs.js");require("../../containers/Views/Views.styled.cjs.js");require("../../containers/Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js");require("../../containers/Views/ViewsMenu/ViewsMenu.cjs.js");require("../EntityPanelUploader/EntityPanelUploader.styled.cjs.js");require("../SimpleFormDialog/SimpleFormDialog.cjs.js");require("../EntityPath/EntityPath.styled.cjs.js");require("../EntityPath/SegmentProvider.cjs.js");require("../DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js");require("../DetailsPanelDetails/DetailsPanelDetails.cjs.js");require("../DetailsPanelDetails/DetailsSection.cjs.js");require("../DetailsPanelDetails/FieldLabel.cjs.js");require("../Watchers/Watchers.cjs.js");require("./ProjectTableSettings.cjs.js");require("../Powerpack/PowerpackButton.cjs.js");require("../Powerpack/PricingLink.cjs.js");require("../Powerpack/PowerpackDialog.styled.cjs.js");require("../Powerpack/CTAButton.cjs.js");require("../SettingsPanel/SettingsPanel.cjs.js");require("../SettingsPanel/SettingsPanelItemTemplate.cjs.js");require("../AttributeEditor/components/MinMaxField.cjs.js");require("../EnumEditor/EnumEditor.styled.cjs.js");require("../SearchFilter/filterDates.cjs.js");require("../Badge/Badge.cjs.js");require("../VersionUploader/components/UploadVersionDialog.cjs.js");require("../VersionUploader/context/VersionUploadContext.cjs.js");require("../Feedback/FeedbackContext.cjs.js");require("../Feedback/SupportBubble.cjs.js");require("../Chips/Chips.cjs.js");require("../LinksManager/LinksManager.styled.cjs.js");require("../../containers/EntityPickerDialog/EntityPickerDialog.cjs.js");require("../StyledLink/StyledLink.cjs.js");require("../LinksManager/CellEditingDialog.cjs.js");require("../../containers/ProjectTreeTable/context/DetailsPanelEntityContext.cjs.js");require("../../containers/ProjectTreeTable/context/SelectedRowsContext.cjs.js");require("../../containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js");require("../../containers/ProjectTreeTable/components/SelectionCell.cjs.js");require("../../containers/ProjectTreeTable/components/RowSelectionHeader.cjs.js");require("../../containers/ProjectTreeTable/context/SelectionCellsContext.cjs.js");require("../../containers/ProjectTreeTable/widgets/LoadMoreWidget.cjs.js");require("../../containers/ProjectTreeTable/context/ProjectTableQueriesContext.cjs.js");require("../../containers/ProjectTreeTable/context/ProjectTableContext.cjs.js");require("../../containers/ProjectTreeTable/context/ClipboardContext.cjs.js");const m=require("../../containers/ProjectTreeTable/context/ColumnSettingsContext.cjs.js");require("../../containers/ProjectTreeTable/context/ProjectDataContext.cjs.js");require("../../containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js");require("../../containers/ProjectTreeTable/components/HeaderActionButton.cjs.js");require("../../containers/ProjectTreeTable/components/ColumnHeaderMenu.cjs.js");const b=(i,u)=>{const[q,r]=e.useState(i);return e.useEffect(()=>{const n=setTimeout(()=>{r(i)},u);return()=>{clearTimeout(n)}},[i,u]),q},w=s.div`
|
|
2
|
+
padding: 16px;
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
gap: 12px;
|
|
6
|
+
`,v=s.label`
|
|
7
|
+
font-weight: 500;
|
|
8
|
+
color: var(--md-sys-color-on-surface);
|
|
9
|
+
font-size: 14px;
|
|
10
|
+
`,y=s.div`
|
|
11
|
+
display: flex;
|
|
12
|
+
align-items: center;
|
|
13
|
+
gap: 12px;
|
|
14
|
+
`,f=s.input`
|
|
15
|
+
flex: 1;
|
|
16
|
+
height: 4px;
|
|
17
|
+
border-radius: 2px;
|
|
18
|
+
background: var(--md-sys-color-outline-variant);
|
|
19
|
+
outline: none;
|
|
20
|
+
-webkit-appearance: none;
|
|
21
|
+
appearance: none;
|
|
22
|
+
|
|
23
|
+
&::-webkit-slider-thumb {
|
|
24
|
+
-webkit-appearance: none;
|
|
25
|
+
appearance: none;
|
|
26
|
+
width: 16px;
|
|
27
|
+
height: 16px;
|
|
28
|
+
border-radius: 50%;
|
|
29
|
+
background: var(--md-sys-color-primary);
|
|
30
|
+
cursor: grab;
|
|
31
|
+
box-shadow: var(--box-fill);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
&:active::-webkit-slider-thumb {
|
|
35
|
+
cursor: grabbing;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
&::-moz-range-thumb {
|
|
39
|
+
width: 16px;
|
|
40
|
+
height: 16px;
|
|
41
|
+
border-radius: 50%;
|
|
42
|
+
background: var(--md-sys-color-primary);
|
|
43
|
+
cursor: grabbing;
|
|
44
|
+
border: 2px solid var(--md-sys-color-surface);
|
|
45
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
&:hover::-webkit-slider-thumb {
|
|
49
|
+
background: var(--md-sys-color-primary-hover);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
&:hover::-moz-range-thumb {
|
|
53
|
+
background: var(--md-sys-color-primary-container);
|
|
54
|
+
}
|
|
55
|
+
`,R=s.span`
|
|
56
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
57
|
+
min-width: 40px;
|
|
58
|
+
text-align: right;
|
|
59
|
+
`,k=()=>{const{rowHeight:i=34,updateRowHeight:u,updateRowHeightWithPersistence:q}=m.useColumnSettingsContext(),[r,n]=e.useState(i),[t,c]=e.useState(!1),l=b(r,25);e.useEffect(()=>{t||n(i)},[i,t]),e.useEffect(()=>{t&&u(l)},[l,u,t]);const g=e.useCallback(x=>{const a=parseInt(x.target.value,10);n(a),t||(u(a),q(a))},[t,u,q]),h=e.useCallback(()=>{c(!0)},[]),p=e.useCallback(()=>{c(!1),q(r)},[r,q]),d=(r-24)/176*100;return o.jsxRuntimeExports.jsxs(w,{children:[o.jsxRuntimeExports.jsx(v,{htmlFor:"row-height-slider",children:"Row height"}),o.jsxRuntimeExports.jsxs(y,{children:[o.jsxRuntimeExports.jsx(f,{id:"row-height-slider",type:"range",min:24,max:200,step:2,value:r,onChange:g,onMouseDown:h,onMouseUp:p,style:{background:`linear-gradient(to right, var(--md-sys-color-primary) 0%, var(--md-sys-color-primary) ${d}%, var(--md-sys-color-outline-variant) ${d}%, var(--md-sys-color-outline-variant) 100%)`}}),o.jsxRuntimeExports.jsx(R,{children:r})]})]})};module.exports=k;
|
|
60
|
+
//# sourceMappingURL=RowHeightSettings.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RowHeightSettings.cjs.js","sources":["../../../../../src/components/ProjectTableSettings/RowHeightSettings.tsx"],"sourcesContent":["import { FC, useState, useCallback, useEffect } from 'react'\nimport styled from 'styled-components'\nimport { useColumnSettingsContext } from '@shared/containers/ProjectTreeTable'\n\n// Debounce hook for smooth slider performance\nconst useDebounce = (value: number, delay: number) => {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value)\n }, delay)\n\n return () => {\n clearTimeout(handler)\n }\n }, [value, delay])\n\n return debouncedValue\n}\n\nconst Container = styled.div`\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n`\n\nconst Label = styled.label`\n font-weight: 500;\n color: var(--md-sys-color-on-surface);\n font-size: 14px;\n`\n\nconst SliderContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 12px;\n`\n\nconst Slider = styled.input`\n flex: 1;\n height: 4px;\n border-radius: 2px;\n background: var(--md-sys-color-outline-variant);\n outline: none;\n -webkit-appearance: none;\n appearance: none;\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--md-sys-color-primary);\n cursor: grab;\n box-shadow: var(--box-fill);\n }\n\n &:active::-webkit-slider-thumb {\n cursor: grabbing;\n }\n\n &::-moz-range-thumb {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--md-sys-color-primary);\n cursor: grabbing;\n border: 2px solid var(--md-sys-color-surface);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n\n &:hover::-webkit-slider-thumb {\n background: var(--md-sys-color-primary-hover);\n }\n\n &:hover::-moz-range-thumb {\n background: var(--md-sys-color-primary-container);\n }\n`\n\nconst ValueDisplay = styled.span`\n color: var(--md-sys-color-on-surface-variant);\n min-width: 40px;\n text-align: right;\n`\n\nconst RowHeightSettings: FC = () => {\n const {\n rowHeight: contextRowHeight = 34,\n updateRowHeight,\n updateRowHeightWithPersistence,\n } = useColumnSettingsContext()\n\n // Local state for immediate UI updates during slider drag\n const [localRowHeight, setLocalRowHeight] = useState(contextRowHeight)\n const [isDragging, setIsDragging] = useState(false)\n\n // Debounced value for smooth table updates during drag\n const debouncedRowHeight = useDebounce(localRowHeight, 25)\n\n // Sync with context row height when it changes externally (but not while dragging)\n useEffect(() => {\n if (!isDragging) {\n setLocalRowHeight(contextRowHeight)\n }\n }, [contextRowHeight, isDragging])\n\n // Update table rows during slider drag (no API persistence)\n useEffect(() => {\n if (isDragging) {\n updateRowHeight(debouncedRowHeight)\n }\n }, [debouncedRowHeight, updateRowHeight, isDragging])\n\n const handleSliderChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = parseInt(e.target.value, 10)\n setLocalRowHeight(newValue)\n\n // If not dragging (e.g., arrow keys), update immediately\n if (!isDragging) {\n updateRowHeight(newValue)\n updateRowHeightWithPersistence(newValue)\n }\n }, [isDragging, updateRowHeight, updateRowHeightWithPersistence])\n\n const handleSliderStart = useCallback(() => {\n setIsDragging(true)\n }, [])\n\n const handleSliderRelease = useCallback(() => {\n setIsDragging(false)\n // Persist to API only when user finishes adjusting\n updateRowHeightWithPersistence(localRowHeight)\n }, [localRowHeight, updateRowHeightWithPersistence])\n\n // Calculate the percentage for the gradient fill\n const fillPercentage = ((localRowHeight - 24) / (200 - 24)) * 100\n\n return (\n <Container>\n <Label htmlFor=\"row-height-slider\">Row height</Label>\n <SliderContainer>\n <Slider\n id=\"row-height-slider\"\n type=\"range\"\n min={24}\n max={200}\n step={2}\n value={localRowHeight}\n onChange={handleSliderChange}\n onMouseDown={handleSliderStart}\n onMouseUp={handleSliderRelease}\n style={{\n background: `linear-gradient(to right, var(--md-sys-color-primary) 0%, var(--md-sys-color-primary) ${fillPercentage}%, var(--md-sys-color-outline-variant) ${fillPercentage}%, var(--md-sys-color-outline-variant) 100%)`,\n }}\n />\n <ValueDisplay>{localRowHeight}</ValueDisplay>\n </SliderContainer>\n </Container>\n )\n}\n\nexport default RowHeightSettings\n"],"names":["useDebounce","value","delay","debouncedValue","setDebouncedValue","useState","useEffect","handler","Container","styled","Label","SliderContainer","Slider","ValueDisplay","RowHeightSettings","contextRowHeight","updateRowHeight","updateRowHeightWithPersistence","useColumnSettingsContext","localRowHeight","setLocalRowHeight","isDragging","setIsDragging","debouncedRowHeight","handleSliderChange","useCallback","e","newValue","handleSliderStart","handleSliderRelease","fillPercentage","jsx"],"mappings":"kqYAKA,MAAMA,EAAc,CAACC,EAAeC,IAAkB,CACpD,KAAM,CAACC,EAAgBC,CAAiB,EAAIC,EAAAA,SAASJ,CAAK,EAE1DK,OAAAA,EAAAA,UAAU,IAAM,CACR,MAAAC,EAAU,WAAW,IAAM,CAC/BH,EAAkBH,CAAK,GACtBC,CAAK,EAER,MAAO,IAAM,CACX,aAAaK,CAAO,CACtB,CAAA,EACC,CAACN,EAAOC,CAAK,CAAC,EAEVC,CACT,EAEMK,EAAYC,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnBC,EAAQD,EAAO;AAAA;AAAA;AAAA;AAAA,EAMfE,EAAkBF,EAAO;AAAA;AAAA;AAAA;AAAA,EAMzBG,EAASH,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2ChBI,EAAeJ,EAAO;AAAA;AAAA;AAAA;AAAA,EAMtBK,EAAwB,IAAM,CAC5B,KAAA,CACJ,UAAWC,EAAmB,GAC9B,gBAAAC,EACA,+BAAAC,GACEC,2BAAyB,EAGvB,CAACC,EAAgBC,CAAiB,EAAIf,EAAAA,SAASU,CAAgB,EAC/D,CAACM,EAAYC,CAAa,EAAIjB,EAAAA,SAAS,EAAK,EAG5CkB,EAAqBvB,EAAYmB,EAAgB,EAAE,EAGzDb,EAAAA,UAAU,IAAM,CACTe,GACHD,EAAkBL,CAAgB,CACpC,EACC,CAACA,EAAkBM,CAAU,CAAC,EAGjCf,EAAAA,UAAU,IAAM,CACVe,GACFL,EAAgBO,CAAkB,CAEnC,EAAA,CAACA,EAAoBP,EAAiBK,CAAU,CAAC,EAE9C,MAAAG,EAAqBC,cAAaC,GAA2C,CACjF,MAAMC,EAAW,SAASD,EAAE,OAAO,MAAO,EAAE,EAC5CN,EAAkBO,CAAQ,EAGrBN,IACHL,EAAgBW,CAAQ,EACxBV,EAA+BU,CAAQ,EAExC,EAAA,CAACN,EAAYL,EAAiBC,CAA8B,CAAC,EAE1DW,EAAoBH,EAAAA,YAAY,IAAM,CAC1CH,EAAc,EAAI,CACpB,EAAG,EAAE,EAECO,EAAsBJ,EAAAA,YAAY,IAAM,CAC5CH,EAAc,EAAK,EAEnBL,EAA+BE,CAAc,CAAA,EAC5C,CAACA,EAAgBF,CAA8B,CAAC,EAG7Ca,GAAmBX,EAAiB,IAAO,IAAa,IAE9D,gCACGX,EACC,CAAA,SAAA,CAACuB,EAAA,kBAAA,IAAArB,EAAA,CAAM,QAAQ,oBAAoB,SAAU,aAAA,2BAC5CC,EACC,CAAA,SAAA,CAAAoB,EAAA,kBAAA,IAACnB,EAAA,CACC,GAAG,oBACH,KAAK,QACL,IAAK,GACL,IAAK,IACL,KAAM,EACN,MAAOO,EACP,SAAUK,EACV,YAAaI,EACb,UAAWC,EACX,MAAO,CACL,WAAY,yFAAyFC,CAAc,0CAA0CA,CAAc,8CAAA,CAC7K,CACF,EACAC,EAAAA,kBAAAA,IAAClB,GAAc,SAAeM,CAAA,CAAA,CAAA,CAChC,CAAA,CAAA,EACF,CAEJ"}
|