abmp-npm 1.1.76 → 1.1.78

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.
@@ -20,7 +20,7 @@ async function updateContactInfo(contactId, updateInfoCallback, operationName) {
20
20
  const currentInfo = contact.info;
21
21
  const updatedInfo = updateInfoCallback(currentInfo);
22
22
 
23
- await elevatedUpdateContact(contactId, { info: updatedInfo }, contact.revision);
23
+ await elevatedUpdateContact(contactId, updatedInfo, contact.revision);
24
24
  } catch (error) {
25
25
  console.error(`Error in ${operationName}:`, error);
26
26
  throw new Error(`Failed to ${operationName}: ${error.message}`);
@@ -5,11 +5,18 @@ const { changeWixMembersEmails } = require('./utils');
5
5
 
6
6
  /**
7
7
  * Processes and saves multiple member records in bulk
8
+ * @param {Object} options - The options object
9
+ * @param {Array} options.memberDataList - Array of member data from API
10
+ * @param {number} options.currentPageNumber - Current page number being processed
11
+ * @param {boolean} [options.addInterests=true] - Whether to add interests to the member data
8
12
  * @param {Array} memberDataList - Array of member data from API
9
- * @param {number} currentPageNumber - Current page number being processed
10
13
  * @returns {Promise<Object>} - Bulk save operation result with statistics
11
14
  */
12
- const bulkProcessAndSaveMemberData = async (memberDataList, currentPageNumber) => {
15
+ const bulkProcessAndSaveMemberData = async ({
16
+ memberDataList,
17
+ currentPageNumber,
18
+ addInterests = true,
19
+ }) => {
13
20
  if (!Array.isArray(memberDataList) || memberDataList.length === 0) {
14
21
  throw new Error('Invalid member data list provided');
15
22
  }
@@ -18,7 +25,11 @@ const bulkProcessAndSaveMemberData = async (memberDataList, currentPageNumber) =
18
25
 
19
26
  try {
20
27
  const processedMemberDataPromises = memberDataList.map(memberData =>
21
- generateUpdatedMemberData(memberData, currentPageNumber)
28
+ generateUpdatedMemberData({
29
+ inputMemberData: memberData,
30
+ currentPageNumber,
31
+ addInterests,
32
+ })
22
33
  );
23
34
 
24
35
  const processedMemberDataList = await Promise.all(processedMemberDataPromises);
@@ -24,8 +24,19 @@ const DEFAULT_MEMBER_DISPLAY_SETTINGS = {
24
24
  showWixUrl: true,
25
25
  };
26
26
 
27
+ const PAC_ASSOCIATIONS = {
28
+ ABMP: 'ABMP',
29
+ ASCP: 'ASCP',
30
+ ANP: 'ANP',
31
+ AHP: 'AHP',
32
+ };
33
+
34
+ const SITES_WITH_INTERESTS_TO_MIGRATE = [PAC_ASSOCIATIONS.ABMP];
35
+
27
36
  module.exports = {
28
37
  MEMBER_ACTIONS,
29
38
  ADDRESS_VISIBILITY_OPTIONS,
30
39
  DEFAULT_MEMBER_DISPLAY_SETTINGS,
40
+ PAC_ASSOCIATIONS,
41
+ SITES_WITH_INTERESTS_TO_MIGRATE,
31
42
  };
@@ -42,7 +42,7 @@ const ensureUniqueUrl = async ({ url, memberId, fullName }) => {
42
42
  excludeDropped: true,
43
43
  excludeSearchedMember: true,
44
44
  memberId,
45
- queryAllMatches: true,
45
+ normalizeSlugForComparison: true,
46
46
  });
47
47
  if (existingMember && existingMember.url) {
48
48
  console.log(
@@ -60,11 +60,17 @@ const ensureUniqueUrl = async ({ url, memberId, fullName }) => {
60
60
 
61
61
  /**
62
62
  * Generates complete updated member data by combining existing and migration data
63
- * @param {Object} inputMemberData - Raw member data from API
64
- * @param {number} currentPageNumber - Current page number being processed
63
+ * @param {Object} options - The options object
64
+ * @param {Object} options.inputMemberData - Raw member data from API
65
+ * @param {string} options.addInterests - Site association of the member
66
+ * @param {number} options.currentPageNumber - Current page number being processed
65
67
  * @returns {Promise<Object|null>} - Complete updated member data or null if validation fails
66
68
  */
67
- async function generateUpdatedMemberData(inputMemberData, currentPageNumber) {
69
+ async function generateUpdatedMemberData({
70
+ inputMemberData,
71
+ addInterests = true,
72
+ currentPageNumber,
73
+ }) {
68
74
  if (!validateCoreMemberData(inputMemberData)) {
69
75
  throw new Error(
70
76
  'Invalid member data: memberid, email (valid string), and memberships (array) are required'
@@ -86,7 +92,11 @@ async function generateUpdatedMemberData(inputMemberData, currentPageNumber) {
86
92
 
87
93
  // Only enrich with migration and address data for new members
88
94
  if (!existingDbMember) {
89
- enrichWithMigrationData(updatedMemberData, inputMemberData.migrationData);
95
+ enrichWithMigrationData({
96
+ memberDataToUpdate: updatedMemberData,
97
+ migrationData: inputMemberData.migrationData,
98
+ addInterests,
99
+ });
90
100
 
91
101
  enrichWithAddressData(
92
102
  updatedMemberData,
@@ -196,10 +206,13 @@ async function getNewMemberOnlyFields(inputMemberData, existingDbMember) {
196
206
  }
197
207
  /**
198
208
  * Enriches member data with optional migration properties
199
- * @param {Object} memberDataToUpdate - Member data object to enhance
209
+ * @param {Object} options - The options object
210
+ * @param {Object} options.memberDataToUpdate - Member data object to enhance
211
+ * @param {Object} options.migrationData - Migration data containing optional properties
212
+ * @param {boolean} [options.addInterests=true] - Whether to add interests to the member data
200
213
  * @param {Object} migrationData - Migration data containing optional properties
201
214
  */
202
- function enrichWithMigrationData(memberDataToUpdate, migrationData) {
215
+ function enrichWithMigrationData({ memberDataToUpdate, migrationData, addInterests = true }) {
203
216
  if (!migrationData) return;
204
217
 
205
218
  memberDataToUpdate.addressInfo = migrationData.addressinfo;
@@ -209,7 +222,7 @@ function enrichWithMigrationData(memberDataToUpdate, migrationData) {
209
222
  memberDataToUpdate.showWebsite = true;
210
223
  }
211
224
 
212
- if (migrationData.interests) {
225
+ if (addInterests && migrationData.interests) {
213
226
  memberDataToUpdate.areasOfPractices = processInterests(migrationData.interests);
214
227
  }
215
228
  }
@@ -6,6 +6,7 @@ const { TASKS_NAMES } = require('../tasks/consts');
6
6
  const { getSiteConfigs } = require('../utils');
7
7
 
8
8
  const { bulkProcessAndSaveMemberData } = require('./bulk-process-methods');
9
+ const { SITES_WITH_INTERESTS_TO_MIGRATE } = require('./consts');
9
10
  const { isUpdatedMember, isSiteAssociatedMember } = require('./utils');
10
11
 
11
12
  async function syncMembersDataPerAction(action) {
@@ -79,6 +80,7 @@ async function synchronizeSinglePage(taskObject) {
79
80
  getSiteConfigs(CONFIG_KEYS.SITE_ASSOCIATION),
80
81
  fetchPACMembers(pageNumber, action),
81
82
  ]);
83
+ const addInterests = SITES_WITH_INTERESTS_TO_MIGRATE.includes(siteAssociation);
82
84
  if (
83
85
  !memberDataResponse ||
84
86
  !memberDataResponse.results ||
@@ -98,7 +100,11 @@ async function synchronizeSinglePage(taskObject) {
98
100
  message: `No to be updated, or members of association: '${siteAssociation}' found`,
99
101
  };
100
102
  }
101
- const result = await bulkProcessAndSaveMemberData(toSyncMembers, pageNumber);
103
+ const result = await bulkProcessAndSaveMemberData({
104
+ memberDataList: toSyncMembers,
105
+ currentPageNumber: pageNumber,
106
+ addInterests,
107
+ });
102
108
 
103
109
  return {
104
110
  success: true,
@@ -11,7 +11,8 @@ const wixData = {
11
11
  remove: auth.elevate(items.remove),
12
12
  get: auth.elevate(items.get),
13
13
  truncate: auth.elevate(items.truncate),
14
+ bulkSave: auth.elevate(items.bulkSave),
15
+ search: auth.elevate(items.search),
14
16
  //TODO: add other methods here as needed
15
17
  };
16
-
17
18
  module.exports = { wixData };
package/backend/jobs.js CHANGED
@@ -1,6 +1,7 @@
1
1
  const { taskManager } = require('psdev-task-manager');
2
2
 
3
- const { TASKS, TASKS_NAMES } = require('./tasks/consts');
3
+ const { TASKS_NAMES } = require('./tasks/consts');
4
+ const { TASKS } = require('./tasks/tasks-configs');
4
5
 
5
6
  async function runScheduledTasks() {
6
7
  try {
@@ -10,6 +10,7 @@ const {
10
10
  normalizeUrlForComparison,
11
11
  queryAllItems,
12
12
  generateGeoHash,
13
+ searchAllItems,
13
14
  } = require('./utils');
14
15
 
15
16
  /**
@@ -108,7 +109,7 @@ async function findMemberById(memberId) {
108
109
  * @param {boolean} options.excludeDropped - Whether to exclude dropped members (default: true)
109
110
  * @param {boolean} options.excludeSearchedMember - Whether to exclude a specific member (default: false)
110
111
  * @param {string|number} [options.memberId] - Member ID to exclude when excludeSearchedMember is true (optional)
111
- * @param {boolean} [options.queryAllMatches=false] - Whether to query all matches or just the first one (default: false)
112
+ * @param {boolean} [options.normalizeSlugForComparison=false] - Whether to normalize the slug for comparison (default: false)
112
113
  * @returns {Promise<Object|null>} - Member data or null if not found
113
114
  */
114
115
  async function getMemberBySlug({
@@ -116,12 +117,12 @@ async function getMemberBySlug({
116
117
  excludeDropped = true,
117
118
  excludeSearchedMember = false,
118
119
  memberId = null,
119
- queryAllMatches = false,
120
+ normalizeSlugForComparison = false,
120
121
  }) {
121
122
  if (!slug) return null;
122
123
 
123
124
  try {
124
- let query = wixData.query(COLLECTIONS.MEMBERS_DATA).contains('url', slug);
125
+ let query = wixData.search(COLLECTIONS.MEMBERS_DATA).expression(slug);
125
126
 
126
127
  if (excludeDropped) {
127
128
  query = query.ne('action', 'drop');
@@ -130,17 +131,13 @@ async function getMemberBySlug({
130
131
  if (excludeSearchedMember && memberId) {
131
132
  query = query.ne('memberId', memberId);
132
133
  }
133
- let membersList;
134
- if (queryAllMatches) {
135
- query = query.limit(1000);
136
- membersList = await queryAllItems(query);
137
- } else {
138
- membersList = await query.find().then(res => res.items);
139
- }
134
+ query = query.limit(1000);
135
+ const searchResult = await searchAllItems(query);
136
+ const membersList = searchResult.items.filter(item => item.url && item.url.includes(slug)); //replacement for contains
140
137
  let matchingMembers = membersList.filter(
141
138
  item => item.url && item.url.toLowerCase() === slug.toLowerCase()
142
139
  );
143
- if (queryAllMatches) {
140
+ if (normalizeSlugForComparison) {
144
141
  matchingMembers = membersList
145
142
  .filter(
146
143
  //remove trailing "-1", "-2", etc.
@@ -152,7 +149,7 @@ async function getMemberBySlug({
152
149
  const queryResultMsg = `Multiple members found with same slug ${slug} membersIds are : [${matchingMembers
153
150
  .map(member => member.memberId)
154
151
  .join(', ')}]`;
155
- if (!queryAllMatches) {
152
+ if (!normalizeSlugForComparison) {
156
153
  throw new Error(queryResultMsg);
157
154
  } else {
158
155
  console.log(queryResultMsg);
package/backend/utils.js CHANGED
@@ -107,18 +107,28 @@ function getAddressesByStatus(addresses = [], addressDisplayOption = []) {
107
107
  })
108
108
  .filter(Boolean);
109
109
  }
110
- const queryAllItems = async query => {
111
- console.log('start query');
112
- let oldResults = await query.find();
110
+ const getAllItems = async querySearchResult => {
111
+ let oldResults = querySearchResult;
113
112
  console.log(`found items: ${oldResults.items.length}`);
114
113
  const allItems = oldResults.items;
115
114
  while (oldResults.hasNext()) {
116
115
  oldResults = await oldResults.next();
117
116
  allItems.push(...oldResults.items);
118
117
  }
119
- console.log(`all items: ${allItems.length}`);
118
+ console.log(`all items count : ${allItems.length}`);
120
119
  return allItems;
121
120
  };
121
+ const searchAllItems = async searchQuery => {
122
+ console.log('start search');
123
+ const searchResults = await searchQuery.run();
124
+ return getAllItems(searchResults);
125
+ };
126
+
127
+ const queryAllItems = async query => {
128
+ console.log('start query');
129
+ const queryResults = await query.find();
130
+ return getAllItems(queryResults);
131
+ };
122
132
  /**
123
133
  * Chunks large arrays into smaller chunks for processing
124
134
  * @param {Array} array - Array to chunk
@@ -206,4 +216,5 @@ module.exports = {
206
216
  formatDateOnly,
207
217
  getAddressesByStatus,
208
218
  isPAC_STAFF,
219
+ searchAllItems,
209
220
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abmp-npm",
3
- "version": "1.1.76",
3
+ "version": "1.1.78",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "check-cycles": "madge --circular .",
@@ -0,0 +1,13 @@
1
+ const { lightbox } = require('@wix/site-window');
2
+
3
+ async function saveAlertsOnReady({ $w: _$w }) {
4
+ const receivedData = await lightbox.getContext();
5
+ _$w('#closeButton').onClick(() => lightbox.close());
6
+ _$w('#cancelButton').onClick(() => lightbox.close());
7
+ _$w('#leaveButton').link = receivedData?.membersExternalPortalUrl;
8
+ _$w('#leaveButton').target = '_blank';
9
+ }
10
+
11
+ module.exports = {
12
+ saveAlertsOnReady,
13
+ };
@@ -0,0 +1,46 @@
1
+ const { lightbox } = require('@wix/site-window');
2
+
3
+ function selectBannerImagesOnReady({ $w: _$w }) {
4
+ _$w('#imageDataset').onReady(async () => {
5
+ const numOfItems = _$w('#imageDataset').getTotalCount();
6
+ const result = await _$w('#imageDataset').getItems(0, numOfItems);
7
+ const items = result.items;
8
+ console.log('Loaded items from dataset:', items);
9
+
10
+ _$w('#bannerImagesRepeater').data = items;
11
+ });
12
+
13
+ _$w('#bannerImagesRepeater').onItemReady(($item, itemData, index) => {
14
+ $item('#bannerImage').src = itemData.image; // image field
15
+ $item('#bannerSelected').checked = false;
16
+
17
+ // Only one checkbox can be selected
18
+ $item('#bannerSelected').onChange(() => {
19
+ if ($item('#bannerSelected').checked) {
20
+ _$w('#bannerImagesRepeater').forEachItem(($otherItem, _, otherIndex) => {
21
+ if (otherIndex !== index) {
22
+ $otherItem('#bannerSelected').checked = false;
23
+ }
24
+ });
25
+ }
26
+ });
27
+ });
28
+
29
+ _$w('#uploadSelectedImages').onClick(() => {
30
+ let selectedImage = null;
31
+
32
+ _$w('#bannerImagesRepeater').forEachItem(($item, itemData) => {
33
+ if ($item('#bannerSelected').checked) {
34
+ selectedImage = {
35
+ image: itemData.image,
36
+ title: itemData.title,
37
+ };
38
+ }
39
+ });
40
+ lightbox.close(selectedImage);
41
+ });
42
+ }
43
+
44
+ module.exports = {
45
+ selectBannerImagesOnReady,
46
+ };
@@ -0,0 +1,19 @@
1
+ const { lightbox } = require('@wix/site-window');
2
+
3
+ function deleteConfirmOnReady({ $w: _$w }) {
4
+ _$w('#delete').onClick(() => {
5
+ lightbox.close({
6
+ toDelete: true,
7
+ });
8
+ });
9
+
10
+ _$w('#cancel').onClick(() => {
11
+ lightbox.close({
12
+ toDelete: false,
13
+ });
14
+ });
15
+ }
16
+
17
+ module.exports = {
18
+ deleteConfirmOnReady,
19
+ };
package/pages/index.js CHANGED
@@ -5,4 +5,7 @@ module.exports = {
5
5
  ...require('./personalDetails.js'),
6
6
  ...require('./QAPage.js'),
7
7
  ...require('./LoadingPage.js'),
8
+ ...require('./SelectBannerImages.js'),
9
+ ...require('./deleteConfirm.js'),
10
+ ...require('./SaveAlerts.js'),
8
11
  };
@@ -127,6 +127,8 @@ const createHomepageUtils = (_$w, filterProfiles) => {
127
127
 
128
128
  paginateSearchResults(searchResults, pagination);
129
129
  await updateUrlParams(filter, pagination);
130
+
131
+ _$w('#resultsStateBox').scrollTo();
130
132
  }
131
133
 
132
134
  async function onChangeMultiCheckbox({