@elementor/editor-global-classes 4.2.0-921 → 4.2.0-923

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elementor/editor-global-classes",
3
- "version": "4.2.0-921",
3
+ "version": "4.2.0-923",
4
4
  "private": false,
5
5
  "author": "Elementor Team",
6
6
  "homepage": "https://elementor.com/",
@@ -39,29 +39,29 @@
39
39
  "dev": "tsup --config=../../tsup.dev.ts"
40
40
  },
41
41
  "dependencies": {
42
- "@elementor/editor": "4.2.0-921",
43
- "@elementor/editor-current-user": "4.2.0-921",
44
- "@elementor/editor-documents": "4.2.0-921",
45
- "@elementor/editor-editing-panel": "4.2.0-921",
46
- "@elementor/editor-mcp": "4.2.0-921",
47
- "@elementor/editor-panels": "4.2.0-921",
48
- "@elementor/editor-props": "4.2.0-921",
49
- "@elementor/editor-variables": "4.2.0-921",
50
- "@elementor/editor-styles": "4.2.0-921",
51
- "@elementor/editor-canvas": "4.2.0-921",
52
- "@elementor/editor-styles-repository": "4.2.0-921",
53
- "@elementor/editor-ui": "4.2.0-921",
54
- "@elementor/editor-v1-adapters": "4.2.0-921",
55
- "@elementor/http-client": "4.2.0-921",
42
+ "@elementor/editor": "4.2.0-923",
43
+ "@elementor/editor-current-user": "4.2.0-923",
44
+ "@elementor/editor-documents": "4.2.0-923",
45
+ "@elementor/editor-editing-panel": "4.2.0-923",
46
+ "@elementor/editor-mcp": "4.2.0-923",
47
+ "@elementor/editor-panels": "4.2.0-923",
48
+ "@elementor/editor-props": "4.2.0-923",
49
+ "@elementor/editor-variables": "4.2.0-923",
50
+ "@elementor/editor-styles": "4.2.0-923",
51
+ "@elementor/editor-canvas": "4.2.0-923",
52
+ "@elementor/editor-styles-repository": "4.2.0-923",
53
+ "@elementor/editor-ui": "4.2.0-923",
54
+ "@elementor/editor-v1-adapters": "4.2.0-923",
55
+ "@elementor/http-client": "4.2.0-923",
56
56
  "@elementor/icons": "~1.75.1",
57
- "@elementor/query": "4.2.0-921",
58
- "@elementor/schema": "4.2.0-921",
59
- "@elementor/store": "4.2.0-921",
57
+ "@elementor/query": "4.2.0-923",
58
+ "@elementor/schema": "4.2.0-923",
59
+ "@elementor/store": "4.2.0-923",
60
60
  "@elementor/ui": "1.37.5",
61
- "@elementor/utils": "4.2.0-921",
61
+ "@elementor/utils": "4.2.0-923",
62
62
  "@tanstack/react-virtual": "^3.13.24",
63
63
  "@wordpress/i18n": "^5.13.0",
64
- "@elementor/events": "4.2.0-921"
64
+ "@elementor/events": "4.2.0-923"
65
65
  },
66
66
  "peerDependencies": {
67
67
  "react": "^18.3.1",
@@ -9,6 +9,7 @@ import { __ } from '@wordpress/i18n';
9
9
  import { useClassesOrder } from '../../hooks/use-classes-order';
10
10
  import { useFilters } from '../../hooks/use-filters';
11
11
  import { useOrderedClasses } from '../../hooks/use-ordered-classes';
12
+ import { loadExistingClasses } from '../../load-existing-classes';
12
13
  import { slice } from '../../store';
13
14
  import { trackGlobalClasses } from '../../utils/tracking';
14
15
  import { useSearchAndFilters } from '../search-and-filter/context';
@@ -21,6 +22,8 @@ import { SortableItem, SortableProvider } from './sortable';
21
22
  const ROW_HEIGHT = 40;
22
23
  const OVERSCAN = 6;
23
24
 
25
+ type LoadingClassesMap = Record< StyleDefinitionID, boolean >;
26
+
24
27
  type GlobalClassesListProps = {
25
28
  disabled?: boolean;
26
29
  scrollElement?: HTMLElement | null;
@@ -41,6 +44,17 @@ export const GlobalClassesList = ( {
41
44
  const dispatch = useDispatch();
42
45
  const filters = useFilters();
43
46
  const [ draggedItemId, setDraggedItemId ] = useState< StyleDefinitionID | null >( null );
47
+ const [ loading, setLoading ] = useState< LoadingClassesMap >( {} );
48
+
49
+ const addLoadingClass = ( classId: StyleDefinitionID ) =>
50
+ setLoading( ( prev ) => ( { ...prev, [ classId ]: true } ) );
51
+
52
+ const removeLoadingClass = ( classId: StyleDefinitionID ) =>
53
+ setLoading( ( prev ) => {
54
+ const { [ classId ]: _, ...rest } = prev;
55
+ return rest;
56
+ } );
57
+
44
58
  const draggedItemLabel = cssClasses.find( ( cssClass ) => cssClass.id === draggedItemId )?.label ?? '';
45
59
  const [ classesOrder, reorderClasses ] = useReorder( draggedItemId, setDraggedItemId, draggedItemLabel ?? '' );
46
60
  const filteredCssClasses = useFilteredCssClasses();
@@ -133,25 +147,34 @@ export const GlobalClassesList = ( {
133
147
  <ClassItem
134
148
  id={ cssClass.id }
135
149
  label={ cssClass.label }
136
- renameClass={ ( newLabel: string ) => {
137
- trackGlobalClasses( {
138
- event: 'classRenamed',
139
- classId: cssClass.id,
140
- oldValue: cssClass.label,
141
- newValue: newLabel,
142
- source: 'class-manager',
143
- } );
144
- dispatch(
145
- slice.actions.update( {
146
- style: {
147
- id: cssClass.id,
148
- label: newLabel,
149
- },
150
- } )
151
- );
150
+ renameClass={ async ( newLabel: string ) => {
151
+ addLoadingClass( cssClass.id );
152
+
153
+ try {
154
+ trackGlobalClasses( {
155
+ event: 'classRenamed',
156
+ classId: cssClass.id,
157
+ oldValue: cssClass.label,
158
+ newValue: newLabel,
159
+ source: 'class-manager',
160
+ } );
161
+
162
+ void ( await loadExistingClasses( [ cssClass.id ] ) );
163
+
164
+ dispatch(
165
+ slice.actions.update( {
166
+ style: {
167
+ id: cssClass.id,
168
+ label: newLabel,
169
+ },
170
+ } )
171
+ );
172
+ } finally {
173
+ removeLoadingClass( cssClass.id );
174
+ }
152
175
  } }
153
176
  selected={ isDragged }
154
- disabled={ disabled || isDragPlaceholder }
177
+ disabled={ disabled || isDragPlaceholder || loading[ cssClass.id ] }
155
178
  sortableTriggerProps={ {
156
179
  ...triggerProps,
157
180
  style: triggerStyle,
@@ -27,14 +27,21 @@ function resetGlobalClassesState( globalOrder: StyleDefinitionID[], classLabels:
27
27
  }
28
28
 
29
29
  export async function loadCurrentDocumentClasses() {
30
- const previewIndexRes = await apiClient.all( 'preview' );
30
+ const [ previewIndexRes, frontendIndexRes ] = await Promise.all( [
31
+ apiClient.all( 'preview' ),
32
+ apiClient.all( 'frontend' ),
33
+ ] );
34
+
31
35
  const previewIndex = previewIndexRes.data.data;
36
+ const frontendIndex = frontendIndexRes.data.data;
37
+
32
38
  const classLabels = createLabelsForClasses( previewIndex );
33
- const globalOrder = previewIndex.map( ( e ) => e.id );
39
+ const previewOrder = previewIndex.map( ( e ) => e.id );
40
+ const frontendOrder = frontendIndex.map( ( e ) => e.id );
34
41
 
35
42
  // This is intended to establish the baseline with current labels and order
36
43
  // without it we won't be able to properly resolve the styles' class names
37
- resetGlobalClassesState( globalOrder, classLabels );
44
+ resetGlobalClassesState( previewOrder, classLabels );
38
45
 
39
46
  const postId = getCurrentDocument()?.id;
40
47
  if ( ! postId ) {
@@ -51,8 +58,8 @@ export async function loadCurrentDocumentClasses() {
51
58
 
52
59
  dispatch(
53
60
  slice.actions.load( {
54
- preview: { items: previewItems, order: globalOrder },
55
- frontend: { items: frontendItems, order: globalOrder },
61
+ preview: { items: previewItems, order: previewOrder },
62
+ frontend: { items: frontendItems, order: frontendOrder },
56
63
  classLabels,
57
64
  } )
58
65
  );
package/src/store.ts CHANGED
@@ -339,7 +339,7 @@ export const selectClass = ( state: SliceState< typeof slice >, id: StyleDefinit
339
339
  state[ SLICE_NAME ].data.items[ id ] ?? null;
340
340
 
341
341
  export const selectEmptyCssClass = createSelector( selectData, ( { items } ) =>
342
- Object.values( items ).filter( ( cssClass ) => cssClass.variants.length === 0 )
342
+ Object.values( items ).filter( ( cssClass ) => ( cssClass.variants?.length ?? 0 ) === 0 )
343
343
  );
344
344
 
345
345
  export const selectIsClassFetched = ( state: SliceState< typeof slice >, id: StyleDefinitionID ) =>