@@ -926,28 +926,42 @@ private function blockViewActionMenuItems(): array
926926 $ view ->registerJsWithVars (fn ($ expandAllId , $ collapseAllId , $ fieldId ) => <<<JS
927927(() => {
928928 const field = $('#' + $ fieldId);
929- const expandAllBtn = $('#' + $ expandAllId);
930- const collapseAllBtn = $('#' + $ collapseAllId);
931- const getBlocks = () => field.find(' > .blocks > .matrixblock');
932-
933- expandAllBtn.on('activate', () => {
929+ const expandBtn = $('#' + $ expandAllId);
930+ const collapseBtn = $('#' + $ collapseAllId);
931+ const getBlocks = () => {
932+ const blocks = field.find(' > .blocks > .matrixblock');
933+ const selectedBlocks = blocks.filter('.sel');
934+ return selectedBlocks.length ? selectedBlocks : blocks;
935+ };
936+
937+ expandBtn.on('activate', () => {
934938 getBlocks().each((i, block) => {
935939 $(block).data('entry').expand();
936940 });
937941 });
938942
939- collapseAllBtn .on('activate', () => {
943+ collapseBtn .on('activate', () => {
940944 getBlocks().each((i, block) => {
941945 $(block).data('entry').collapse();
942946 });
943947 });
944948
945949 setTimeout(() => {
946- const menu = expandAllBtn .closest('.menu').data('disclosureMenu');
950+ const menu = expandBtn .closest('.menu').data('disclosureMenu');
947951 menu.on('show', () => {
948- const blocks = getBlocks();
949- menu.toggleItem(expandAllBtn[0], blocks.is('.collapsed'));
950- menu.toggleItem(collapseAllBtn[0], blocks.is(':not(.collapsed)'));
952+ let blocks = getBlocks();
953+ let expandLabel, collapseLabel;
954+ if (blocks.is('.sel')) {
955+ expandLabel = Craft.t('app', 'Expand selected blocks');
956+ collapseLabel = Craft.t('app', 'Collapse selected blocks');
957+ } else {
958+ expandLabel = Craft.t('app', 'Expand all blocks');
959+ collapseLabel = Craft.t('app', 'Collapse all blocks');
960+ }
961+ expandBtn.find('.menu-item-label').text(expandLabel);
962+ collapseBtn.find('.menu-item-label').text(collapseLabel);
963+ menu.toggleItem(expandBtn[0], !!blocks.filter('.collapsed').length);
964+ menu.toggleItem(collapseBtn[0], !!blocks.filter(':not(.collapsed)').length);
951965 });
952966 }, 1);
953967})();
@@ -957,7 +971,7 @@ private function blockViewActionMenuItems(): array
957971 $ view ->namespaceInputId ($ this ->getInputId ()),
958972 ]);
959973
960- // Copy all
974+ // Copy
961975 if ($ this ->maxEntries !== 1 ) {
962976 $ items [] = ['type ' => 'hr ' ];
963977
@@ -975,39 +989,62 @@ private function blockViewActionMenuItems(): array
975989 'type ' => Entry::class,
976990 'fieldId ' => $ this ->id ,
977991 ]);
978- $ copyAllJs = <<<JS
979- copyAllBtn.on('activate', () => {
980- const elementInfo = [];
981- field.find('> .blocks > .matrixblock').each((i, element) => {
982- element = $(element);
983- elementInfo.push(Object.assign({
984- id: element.data('id'),
985- draftId: element.data('draftId'),
986- revisionId: element.data('revisionId'),
987- ownerId: element.data('ownerId'),
988- siteId: element.data('siteId'),
989- }, $ baseInfo));
990- });
991- Craft.cp.copyElements(elementInfo);
992- });
993- JS ;
994992
995- $ view ->registerJsWithVars (fn ($ copyAllId , $ fieldId ) => <<<JS
993+ $ view ->registerJsWithVars (fn ($ copyAllId , $ fieldId, $ type ) => <<<JS
996994(() => {
997- const copyAllBtn = $('#' + $ copyAllId);
995+ const copyBtn = $('#' + $ copyAllId);
998996 const field = $('#' + $ fieldId);
997+ const getBlocks = () => {
998+ const blocks = field.find(' > .blocks > .matrixblock');
999+ const selectedBlocks = blocks.filter('.sel');
1000+ return selectedBlocks.length ? selectedBlocks : blocks;
1001+ };
1002+
9991003 if (field.length) {
1000- $ copyAllJs
1004+ copyBtn.on('activate', () => {
1005+ const elementInfo = [];
1006+ getBlocks().each((i, element) => {
1007+ element = $(element);
1008+ elementInfo.push(Object.assign({
1009+ id: element.data('id'),
1010+ draftId: element.data('draftId'),
1011+ revisionId: element.data('revisionId'),
1012+ ownerId: element.data('ownerId'),
1013+ siteId: element.data('siteId'),
1014+ }, $ baseInfo));
1015+ });
1016+ Craft.cp.copyElements(elementInfo);
1017+ });
10011018 } else {
10021019 setTimeout(() => {
1003- const menu = copyAllBtn .closest('.menu').data('disclosureMenu');
1004- menu.removeItem(copyAllBtn [0]);
1020+ const menu = copyBtn .closest('.menu').data('disclosureMenu');
1021+ menu.removeItem(copyBtn [0]);
10051022 }, 1);
10061023 }
1024+
1025+ setTimeout(() => {
1026+ const menu = copyBtn.closest('.menu').data('disclosureMenu');
1027+ menu.on('show', () => {
1028+ let blocks = getBlocks();
1029+ let copyLabel;
1030+ if (blocks.is('.sel')) {
1031+ copyLabel = Craft.t('app', 'Copy selected {type}', {
1032+ type: $ type,
1033+ });
1034+ } else {
1035+ copyLabel = Craft.t('app', 'Copy all {type}', {
1036+ type: $ type,
1037+ });
1038+ }
1039+ copyBtn.find('.menu-item-label').text(copyLabel);
1040+ menu.toggleItem(copyBtn[0], !!blocks.length);
1041+ });
1042+ }, 1);
10071043})();
10081044JS , [
10091045 $ view ->namespaceInputId ($ copyAllId ),
10101046 $ view ->namespaceInputId ($ this ->getInputId ()),
1047+ Entry::pluralLowerDisplayName (),
10111048 ]);
10121049 }
10131050
@@ -1031,22 +1068,19 @@ private function cardViewActionMenuItems(): array
10311068 ])),
10321069 ];
10331070
1034- $ copyAllJs = <<<JS
1035- copyAllBtn.on('activate', () => {
1036- Craft.cp.copyElements(field.find('> .nested-element-cards > .elements > li > .element'));
1037- });
1038- JS ;
10391071
10401072 $ view ->registerJsWithVars (fn ($ copyAllId , $ fieldId ) => <<<JS
10411073(() => {
1042- const copyAllBtn = $('#' + $ copyAllId);
1074+ const copyBtn = $('#' + $ copyAllId);
10431075 const field = $('#' + $ fieldId);
10441076 if (field.length) {
1045- $ copyAllJs
1077+ copyBtn.on('activate', () => {
1078+ Craft.cp.copyElements(field.find('> .nested-element-cards > .elements > li > .element'));
1079+ });
10461080 } else {
10471081 setTimeout(() => {
1048- const menu = copyAllBtn .closest('.menu').data('disclosureMenu');
1049- menu.removeItem(copyAllBtn [0]);
1082+ const menu = copyBtn .closest('.menu').data('disclosureMenu');
1083+ menu.removeItem(copyBtn [0]);
10501084 }, 1);
10511085 }
10521086})();
0 commit comments