@elementor/editor-editing-panel 1.42.0 → 1.43.1

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/index.mjs CHANGED
@@ -8,16 +8,15 @@ var { registerControlReplacement, getControlReplacements } = createControlReplac
8
8
  // src/components/css-classes/css-class-selector.tsx
9
9
  import * as React8 from "react";
10
10
  import { useRef, useState as useState4 } from "react";
11
- import { getElementSetting as getElementSetting2, updateElementSettings as updateElementSettings2, useElementSetting } from "@elementor/editor-elements";
12
- import { classesPropTypeUtil as classesPropTypeUtil2 } from "@elementor/editor-props";
11
+ import { useElementSetting } from "@elementor/editor-elements";
13
12
  import {
14
13
  isElementsStylesProvider as isElementsStylesProvider2,
15
14
  stylesRepository as stylesRepository4,
16
- useGetStylesRepositoryCreateAction,
17
15
  useProviders,
16
+ useUserStylesCapability as useUserStylesCapability4,
18
17
  validateStyleLabel as validateStyleLabel2
19
18
  } from "@elementor/editor-styles-repository";
20
- import { WarningInfotip } from "@elementor/editor-ui";
19
+ import { InfoAlert, WarningInfotip } from "@elementor/editor-ui";
21
20
  import { ColorSwatchIcon, MapPinIcon } from "@elementor/icons";
22
21
  import { createLocation } from "@elementor/locations";
23
22
  import { Box as Box2, Chip as Chip3, FormLabel, Link, Stack as Stack3, Typography as Typography3 } from "@elementor/ui";
@@ -441,7 +440,7 @@ var StyledGroupItems = styled("ul")`
441
440
  // src/components/css-classes/css-class-item.tsx
442
441
  import * as React7 from "react";
443
442
  import { useState as useState3 } from "react";
444
- import { stylesRepository as stylesRepository3, validateStyleLabel } from "@elementor/editor-styles-repository";
443
+ import { stylesRepository as stylesRepository3, useUserStylesCapability as useUserStylesCapability3, validateStyleLabel } from "@elementor/editor-styles-repository";
445
444
  import { EditableField, EllipsisWithTooltip, useEditable } from "@elementor/editor-ui";
446
445
  import { DotsVerticalIcon } from "@elementor/icons";
447
446
  import {
@@ -507,12 +506,20 @@ import { useCallback, useMemo as useMemo2 } from "react";
507
506
  import { setDocumentModifiedStatus } from "@elementor/editor-documents";
508
507
  import { getElementLabel, getElementSetting, updateElementSettings } from "@elementor/editor-elements";
509
508
  import { classesPropTypeUtil } from "@elementor/editor-props";
509
+ import { useGetStylesRepositoryCreateAction } from "@elementor/editor-styles-repository";
510
510
  import { isExperimentActive, undoable } from "@elementor/editor-v1-adapters";
511
511
  import { __ } from "@wordpress/i18n";
512
+
513
+ // src/sync/experiments-flags.ts
514
+ var EXPERIMENTAL_FEATURES = {
515
+ V_3_30: "e_v_3_30"
516
+ };
517
+
518
+ // src/components/css-classes/use-apply-and-unapply-class.ts
512
519
  function useApplyClass() {
513
520
  const { id: activeId, setId: setActiveId } = useStyle();
514
521
  const { element } = useElement();
515
- const isVersion330Active = isExperimentActive("e_v_3_30");
522
+ const isVersion330Active = isExperimentActive(EXPERIMENTAL_FEATURES.V_3_30);
516
523
  const applyClass = useApply();
517
524
  const unapplyClass = useUnapply();
518
525
  const undoableApply = useMemo2(() => {
@@ -547,7 +554,7 @@ function useApplyClass() {
547
554
  function useUnapplyClass() {
548
555
  const { id: activeId, setId: setActiveId } = useStyle();
549
556
  const { element } = useElement();
550
- const isVersion330Active = isExperimentActive("e_v_3_30");
557
+ const isVersion330Active = isExperimentActive(EXPERIMENTAL_FEATURES.V_3_30);
551
558
  const applyClass = useApply();
552
559
  const unapplyClass = useUnapply();
553
560
  const undoableUnapply = useMemo2(() => {
@@ -579,10 +586,58 @@ function useUnapplyClass() {
579
586
  );
580
587
  return isVersion330Active ? undoableUnapply : unapplyWithoutHistory;
581
588
  }
589
+ function useCreateAndApplyClass() {
590
+ const { id: activeId, setId: setActiveId } = useStyle();
591
+ const isVersion330Active = isExperimentActive(EXPERIMENTAL_FEATURES.V_3_30);
592
+ const [provider, createAction] = useGetStylesRepositoryCreateAction() ?? [null, null];
593
+ const deleteAction = provider?.actions.delete;
594
+ const applyClass = useApply();
595
+ const unapplyClass = useUnapply();
596
+ const undoableCreateAndApply = useMemo2(() => {
597
+ if (!provider || !createAction) {
598
+ return;
599
+ }
600
+ return undoable(
601
+ {
602
+ do: ({ classLabel }) => {
603
+ const prevActiveId = activeId;
604
+ const createdId = createAction(classLabel);
605
+ applyClass(createdId);
606
+ return { prevActiveId, createdId };
607
+ },
608
+ undo: (_, { prevActiveId, createdId }) => {
609
+ unapplyClass(createdId);
610
+ deleteAction?.(createdId);
611
+ setActiveId(prevActiveId);
612
+ }
613
+ },
614
+ {
615
+ title: __("Class", "elementor"),
616
+ subtitle: ({ classLabel }) => {
617
+ return __(`%s created`, "elementor").replace("%s", classLabel);
618
+ }
619
+ }
620
+ );
621
+ }, [activeId, applyClass, createAction, deleteAction, provider, setActiveId, unapplyClass]);
622
+ const createAndApplyWithoutHistory = useCallback(
623
+ ({ classLabel }) => {
624
+ if (!createAction) {
625
+ return;
626
+ }
627
+ const createdId = createAction(classLabel);
628
+ applyClass(createdId);
629
+ },
630
+ [applyClass, createAction]
631
+ );
632
+ if (!provider || !undoableCreateAndApply) {
633
+ return [null, null];
634
+ }
635
+ return isVersion330Active ? [provider, undoableCreateAndApply] : [provider, createAndApplyWithoutHistory];
636
+ }
582
637
  function useApply() {
583
638
  const { element } = useElement();
584
639
  const { setId: setActiveId } = useStyle();
585
- const { setClasses, getAppliedClasses } = useSetClasses();
640
+ const { setClasses, getAppliedClasses } = useClasses();
586
641
  return useCallback(
587
642
  (classIDToApply) => {
588
643
  const appliedClasses = getAppliedClasses();
@@ -601,7 +656,7 @@ function useApply() {
601
656
  function useUnapply() {
602
657
  const { element } = useElement();
603
658
  const { id: activeId, setId: setActiveId } = useStyle();
604
- const { setClasses, getAppliedClasses } = useSetClasses();
659
+ const { setClasses, getAppliedClasses } = useClasses();
605
660
  return useCallback(
606
661
  (classIDToUnapply) => {
607
662
  const appliedClasses = getAppliedClasses();
@@ -619,10 +674,10 @@ function useUnapply() {
619
674
  [activeId, element.id, getAppliedClasses, setActiveId, setClasses]
620
675
  );
621
676
  }
622
- function useSetClasses() {
677
+ function useClasses() {
623
678
  const { element } = useElement();
624
679
  const currentClassesProp = useClassesProp();
625
- const isVersion330Active = isExperimentActive("e_v_3_30");
680
+ const isVersion330Active = isExperimentActive(EXPERIMENTAL_FEATURES.V_3_30);
626
681
  return useMemo2(() => {
627
682
  const setClasses = (ids) => {
628
683
  updateElementSettings({
@@ -635,10 +690,7 @@ function useSetClasses() {
635
690
  }
636
691
  };
637
692
  const getAppliedClasses = () => getElementSetting(element.id, currentClassesProp)?.value || [];
638
- return {
639
- setClasses,
640
- getAppliedClasses
641
- };
693
+ return { setClasses, getAppliedClasses };
642
694
  }, [currentClassesProp, element.id, isVersion330Active]);
643
695
  }
644
696
 
@@ -722,10 +774,10 @@ function StateMenuItem({ state, closeMenu, ...props }) {
722
774
  const { state: activeState } = meta;
723
775
  const { userCan } = useUserStylesCapability2();
724
776
  const modifiedStates = useModifiedStates(styleId);
725
- const isUpdateAllowed = userCan(provider ?? "").updateProps;
777
+ const isUpdateAllowed = !state || userCan(provider ?? "").updateProps;
726
778
  const indicatorVariant = !provider || isElementsStylesProvider(provider) ? "local" : "global";
727
779
  const isStyled = modifiedStates[state ?? "normal"] ?? false;
728
- const disabled = isUpdateAllowed ? false : !isStyled;
780
+ const disabled = !isUpdateAllowed && !isStyled;
729
781
  const isActive = styleId === activeId;
730
782
  const isSelected = state === activeState && isActive;
731
783
  return /* @__PURE__ */ React6.createElement(
@@ -747,7 +799,7 @@ function StateMenuItem({ state, closeMenu, ...props }) {
747
799
  MenuItemInfotip,
748
800
  {
749
801
  showInfoTip: disabled,
750
- content: __2("With your role as an editor, you can only use existing states.", "elementor")
802
+ content: __2("With your current role, you can only use existing states.", "elementor")
751
803
  },
752
804
  /* @__PURE__ */ React6.createElement(Stack, { gap: 0.75, direction: "row", alignItems: "center" }, isStyled && /* @__PURE__ */ React6.createElement(StyleIndicator, { "aria-label": __2("Has style", "elementor"), variant: indicatorVariant }), state ?? "normal")
753
805
  )
@@ -789,7 +841,7 @@ function RenameClassMenuItem({ closeMenu }) {
789
841
  {
790
842
  showInfoTip: !isAllowed,
791
843
  content: __2(
792
- "With your role as an editor, you can use existing classes but can\u2019t modify them.",
844
+ "With your current role, you can use existing classes but can\u2019t modify them.",
793
845
  "elementor"
794
846
  )
795
847
  },
@@ -807,6 +859,7 @@ function CssClassItem(props) {
807
859
  const popupState = usePopupState({ variant: "popover" });
808
860
  const [chipRef, setChipRef] = useState3(null);
809
861
  const { onDelete, ...chipGroupProps } = chipProps;
862
+ const { userCan } = useUserStylesCapability3();
810
863
  const {
811
864
  ref,
812
865
  isEditing,
@@ -821,7 +874,7 @@ function CssClassItem(props) {
821
874
  });
822
875
  const color = error ? "error" : colorProp;
823
876
  const providerActions = provider ? stylesRepository3.getProviderByKey(provider)?.actions : null;
824
- const allowRename = Boolean(providerActions?.update);
877
+ const allowRename = Boolean(providerActions?.update) && userCan(provider ?? "")?.update;
825
878
  const isShowingState = isActive && meta.state;
826
879
  return /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement(
827
880
  UnstableChipGroup,
@@ -908,15 +961,16 @@ var EMPTY_OPTION = {
908
961
  var { Slot: ClassSelectorActionsSlot, inject: injectIntoClassSelectorActions } = createLocation();
909
962
  function CssClassSelector() {
910
963
  const options12 = useOptions();
911
- const { value: appliedIds, pushValue: pushAppliedId } = useAppliedClassesIds();
912
964
  const { id: activeId, setId: setActiveId } = useStyle();
913
965
  const autocompleteRef = useRef(null);
914
966
  const [renameError, setRenameError] = useState4(null);
915
967
  const handleSelect = useHandleSelect();
916
- const { create, validate, entityName } = useCreateAction({ pushAppliedId, setActiveId });
917
- const applied = useAppliedOptions(options12, appliedIds);
918
- const active = applied.find((option) => option.value === activeId) ?? EMPTY_OPTION;
919
- const showPlaceholder = applied.every(({ fixed }) => fixed);
968
+ const { create, validate, entityName } = useCreateAction();
969
+ const appliedOptions = useAppliedOptions(options12);
970
+ const active = appliedOptions.find((option) => option.value === activeId) ?? EMPTY_OPTION;
971
+ const showPlaceholder = appliedOptions.every(({ fixed }) => fixed);
972
+ const { userCan } = useUserStylesCapability4();
973
+ const canEdit = active.provider ? userCan(active.provider).updateProps : true;
920
974
  return /* @__PURE__ */ React8.createElement(Stack3, { p: 2 }, /* @__PURE__ */ React8.createElement(Stack3, { direction: "row", gap: 1, alignItems: "center", justifyContent: "space-between" }, /* @__PURE__ */ React8.createElement(FormLabel, { htmlFor: ID, size: "small" }, __4("Classes", "elementor")), /* @__PURE__ */ React8.createElement(Stack3, { direction: "row", gap: 1 }, /* @__PURE__ */ React8.createElement(ClassSelectorActionsSlot, null))), /* @__PURE__ */ React8.createElement(
921
975
  WarningInfotip,
922
976
  {
@@ -934,7 +988,7 @@ function CssClassSelector() {
934
988
  size: "tiny",
935
989
  placeholder: showPlaceholder ? __4("Type class name", "elementor") : void 0,
936
990
  options: options12,
937
- selected: applied,
991
+ selected: appliedOptions,
938
992
  entityName,
939
993
  onSelect: handleSelect,
940
994
  onCreate: create ?? void 0,
@@ -971,6 +1025,15 @@ function CssClassSelector() {
971
1025
  })
972
1026
  }
973
1027
  )
1028
+ ), !canEdit && /* @__PURE__ */ React8.createElement(
1029
+ InfoAlert,
1030
+ {
1031
+ content: __4(
1032
+ "With your current role, you can use existing classes but can\u2019t modify them.",
1033
+ "elementor"
1034
+ ),
1035
+ sx: { mt: 1 }
1036
+ }
974
1037
  ));
975
1038
  }
976
1039
  var EmptyState = ({ searchValue, onClear }) => /* @__PURE__ */ React8.createElement(Box2, { sx: { py: 4 } }, /* @__PURE__ */ React8.createElement(
@@ -1018,18 +1081,13 @@ function useOptions() {
1018
1081
  });
1019
1082
  });
1020
1083
  }
1021
- function useCreateAction({
1022
- pushAppliedId,
1023
- setActiveId
1024
- }) {
1025
- const [provider, createAction] = useGetStylesRepositoryCreateAction() ?? [null, null];
1084
+ function useCreateAction() {
1085
+ const [provider, createAction] = useCreateAndApplyClass();
1026
1086
  if (!provider || !createAction) {
1027
1087
  return {};
1028
1088
  }
1029
- const create = (newClassLabel) => {
1030
- const createdId = createAction(newClassLabel);
1031
- pushAppliedId(createdId);
1032
- setActiveId(createdId);
1089
+ const create = (classLabel) => {
1090
+ createAction({ classLabel });
1033
1091
  };
1034
1092
  const validate = (newClassLabel, event) => {
1035
1093
  if (hasReachedLimit(provider)) {
@@ -1049,36 +1107,18 @@ function useCreateAction({
1049
1107
  function hasReachedLimit(provider) {
1050
1108
  return provider.actions.all().length >= provider.limit;
1051
1109
  }
1052
- function useAppliedOptions(options12, appliedIds) {
1053
- const applied = options12.filter((option) => option.value && appliedIds.includes(option.value));
1054
- const hasElementsProviderStyleApplied = applied.some(
1110
+ function useAppliedOptions(options12) {
1111
+ const { element } = useElement();
1112
+ const currentClassesProp = useClassesProp();
1113
+ const appliedIds = useElementSetting(element.id, currentClassesProp)?.value || [];
1114
+ const appliedOptions = options12.filter((option) => option.value && appliedIds.includes(option.value));
1115
+ const hasElementsProviderStyleApplied = appliedOptions.some(
1055
1116
  (option) => option.provider && isElementsStylesProvider2(option.provider)
1056
1117
  );
1057
1118
  if (!hasElementsProviderStyleApplied) {
1058
- applied.unshift(EMPTY_OPTION);
1119
+ appliedOptions.unshift(EMPTY_OPTION);
1059
1120
  }
1060
- return applied;
1061
- }
1062
- function useAppliedClassesIds() {
1063
- const { element } = useElement();
1064
- const currentClassesProp = useClassesProp();
1065
- const value = useElementSetting(element.id, currentClassesProp)?.value || [];
1066
- const setValue = (ids) => {
1067
- updateElementSettings2({
1068
- id: element.id,
1069
- props: {
1070
- [currentClassesProp]: classesPropTypeUtil2.create(ids)
1071
- }
1072
- });
1073
- };
1074
- const pushValue = (id) => {
1075
- const ids = getElementSetting2(element.id, currentClassesProp)?.value || [];
1076
- setValue([...ids, id]);
1077
- };
1078
- return {
1079
- value,
1080
- pushValue
1081
- };
1121
+ return appliedOptions;
1082
1122
  }
1083
1123
  function useHandleSelect() {
1084
1124
  const apply = useApplyClass();
@@ -1252,13 +1292,6 @@ var useDefaultPanelSettings = () => {
1252
1292
  import { useState as useState6 } from "react";
1253
1293
  import { isExperimentActive as isExperimentActive2 } from "@elementor/editor-v1-adapters";
1254
1294
  import { getSessionStorageItem, setSessionStorageItem } from "@elementor/session";
1255
-
1256
- // src/sync/experiments-flags.ts
1257
- var EXPERIMENTAL_FEATURES = {
1258
- V_3_30: "e_v_3_30"
1259
- };
1260
-
1261
- // src/hooks/use-state-by-element.ts
1262
1295
  var useStateByElement = (key, initialValue) => {
1263
1296
  const { element } = useElement();
1264
1297
  const isFeatureActive = isExperimentActive2(EXPERIMENTAL_FEATURES.V_3_30);
@@ -1344,7 +1377,7 @@ var getGridLayout = (layout) => ({
1344
1377
  // src/controls-registry/settings-field.tsx
1345
1378
  import * as React15 from "react";
1346
1379
  import { PropKeyProvider, PropProvider } from "@elementor/editor-controls";
1347
- import { updateElementSettings as updateElementSettings3, useElementSetting as useElementSetting2 } from "@elementor/editor-elements";
1380
+ import { updateElementSettings as updateElementSettings2, useElementSetting as useElementSetting2 } from "@elementor/editor-elements";
1348
1381
 
1349
1382
  // src/controls-registry/create-top-level-object-type.ts
1350
1383
  var createTopLevelOjectType = ({ schema }) => {
@@ -1366,7 +1399,7 @@ var SettingsField = ({ bind, children }) => {
1366
1399
  const value = { [bind]: settingsValue };
1367
1400
  const propType = createTopLevelOjectType({ schema: elementType.propsSchema });
1368
1401
  const setValue = (newValue) => {
1369
- updateElementSettings3({
1402
+ updateElementSettings2({
1370
1403
  id: element.id,
1371
1404
  props: { ...newValue }
1372
1405
  });
@@ -1473,7 +1506,7 @@ import { __ as __52 } from "@wordpress/i18n";
1473
1506
  import * as React19 from "react";
1474
1507
  import { createContext as createContext7, useContext as useContext7 } from "react";
1475
1508
  import { getWidgetsCache, useElementSetting as useElementSetting3 } from "@elementor/editor-elements";
1476
- import { classesPropTypeUtil as classesPropTypeUtil3 } from "@elementor/editor-props";
1509
+ import { classesPropTypeUtil as classesPropTypeUtil2 } from "@elementor/editor-props";
1477
1510
  import { getBreakpointsTree } from "@elementor/editor-responsive";
1478
1511
  import { getStylesSchema } from "@elementor/editor-styles";
1479
1512
  import { stylesRepository as stylesRepository5 } from "@elementor/editor-styles-repository";
@@ -1741,7 +1774,7 @@ var useAppliedStyles = () => {
1741
1774
  const baseStyles = useBaseStyles();
1742
1775
  useStylesRerender();
1743
1776
  const classesProp = useElementSetting3(element.id, currentClassesProp);
1744
- const appliedStyles = classesPropTypeUtil3.extract(classesProp) ?? [];
1777
+ const appliedStyles = classesPropTypeUtil2.extract(classesProp) ?? [];
1745
1778
  return stylesRepository5.all().filter((style) => [...baseStyles, ...appliedStyles].includes(style.id));
1746
1779
  };
1747
1780
  var useBaseStyles = () => {
@@ -1758,7 +1791,7 @@ function useActiveStyleDefId(classProp) {
1758
1791
  "active-style-id",
1759
1792
  null
1760
1793
  );
1761
- const appliedClassesIds = useAppliedClassesIds2(classProp)?.value || [];
1794
+ const appliedClassesIds = useAppliedClassesIds(classProp)?.value || [];
1762
1795
  const fallback = useFirstAppliedClass(appliedClassesIds);
1763
1796
  const activeAndAppliedClassId = useActiveAndAppliedClassId(activeStyledDefId, appliedClassesIds);
1764
1797
  return [activeAndAppliedClassId || fallback?.id || null, setActiveStyledDefId];
@@ -1768,7 +1801,7 @@ function useFirstAppliedClass(appliedClassesIds) {
1768
1801
  const stylesDefs = getElementStyles(element.id) ?? {};
1769
1802
  return Object.values(stylesDefs).find((styleDef) => appliedClassesIds.includes(styleDef.id));
1770
1803
  }
1771
- function useAppliedClassesIds2(classProp) {
1804
+ function useAppliedClassesIds(classProp) {
1772
1805
  const { element } = useElement();
1773
1806
  return useElementSetting4(element.id, classProp);
1774
1807
  }