abmp-npm 10.3.10 → 10.3.12
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/backend/jobs.js
CHANGED
|
@@ -98,20 +98,20 @@ async function scheduleNormalizeMemberEmailsTask() {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
/**
|
|
101
|
-
* Schedules
|
|
102
|
-
*
|
|
101
|
+
* Schedules setting ALL addresses for ALL members that have any address to STATE_CITY_ZIP
|
|
102
|
+
* (show city/state/zip, hide the street). Manually triggered one-off maintenance task.
|
|
103
103
|
*/
|
|
104
|
-
async function
|
|
104
|
+
async function scheduleSetAddressesToCityStateTask() {
|
|
105
105
|
try {
|
|
106
|
-
console.log('
|
|
106
|
+
console.log('scheduleSetAddressesToCityState started!');
|
|
107
107
|
return await taskManager().schedule({
|
|
108
|
-
name: TASKS_NAMES.
|
|
108
|
+
name: TASKS_NAMES.scheduleSetAddressesToCityState,
|
|
109
109
|
data: {},
|
|
110
110
|
type: 'scheduled',
|
|
111
111
|
});
|
|
112
112
|
} catch (error) {
|
|
113
|
-
console.error(`Failed to
|
|
114
|
-
throw new Error(`Failed to
|
|
113
|
+
console.error(`Failed to scheduleSetAddressesToCityState: ${error.message}`);
|
|
114
|
+
throw new Error(`Failed to scheduleSetAddressesToCityState: ${error.message}`);
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
|
|
@@ -153,6 +153,6 @@ module.exports = {
|
|
|
153
153
|
scheduleFixPrimaryAddressForMembersTask,
|
|
154
154
|
scheduleFixUrlsWithSpacesTask,
|
|
155
155
|
scheduleNormalizeMemberEmailsTask,
|
|
156
|
-
|
|
156
|
+
scheduleSetAddressesToCityStateTask,
|
|
157
157
|
runDailyPullExecutionCheck,
|
|
158
158
|
};
|
|
@@ -9,35 +9,36 @@ const { TASKS_NAMES } = require('./consts');
|
|
|
9
9
|
|
|
10
10
|
const CHUNK_SIZE = 1000;
|
|
11
11
|
|
|
12
|
+
// Target visibility for every address: show city / state / zip, hide the street address.
|
|
13
|
+
const TARGET_STATUS = ADDRESS_STATUS_TYPES.STATE_CITY_ZIP;
|
|
14
|
+
|
|
12
15
|
const getMemberAddresses = member => (Array.isArray(member.addresses) ? member.addresses : []);
|
|
13
16
|
|
|
14
17
|
/**
|
|
15
|
-
* Whether a member has at least one address
|
|
18
|
+
* Whether a member has at least one address not already at the target status.
|
|
16
19
|
* @param {Object} member
|
|
17
20
|
* @returns {boolean}
|
|
18
21
|
*/
|
|
19
|
-
const
|
|
20
|
-
getMemberAddresses(member).some(
|
|
21
|
-
address => address && address.addressStatus !== ADDRESS_STATUS_TYPES.DONT_SHOW
|
|
22
|
-
);
|
|
22
|
+
const needsCityStateUpdate = member =>
|
|
23
|
+
getMemberAddresses(member).some(address => address && address.addressStatus !== TARGET_STATUS);
|
|
23
24
|
|
|
24
25
|
/**
|
|
25
|
-
* Sets every address on a member to
|
|
26
|
+
* Sets every address on a member to STATE_CITY_ZIP (other address fields are preserved).
|
|
26
27
|
* @param {Object} member
|
|
27
|
-
* @returns {Array} the member's addresses with addressStatus set to
|
|
28
|
+
* @returns {Array} the member's addresses with addressStatus set to STATE_CITY_ZIP
|
|
28
29
|
*/
|
|
29
|
-
const
|
|
30
|
+
const setAddressesToCityState = member =>
|
|
30
31
|
getMemberAddresses(member).map(address => ({
|
|
31
32
|
...address,
|
|
32
|
-
addressStatus:
|
|
33
|
+
addressStatus: TARGET_STATUS,
|
|
33
34
|
}));
|
|
34
35
|
|
|
35
36
|
/**
|
|
36
|
-
* Schedules tasks to
|
|
37
|
-
* Manually triggered (not cron-wired).
|
|
37
|
+
* Schedules tasks to set ALL addresses for ALL members to STATE_CITY_ZIP (show city/state/zip,
|
|
38
|
+
* hide the street). Manually triggered (not cron-wired).
|
|
38
39
|
*/
|
|
39
|
-
async function
|
|
40
|
-
console.log('=== Scheduling
|
|
40
|
+
async function scheduleSetAddressesToCityState() {
|
|
41
|
+
console.log('=== Scheduling Set Addresses To City/State Tasks ===');
|
|
41
42
|
|
|
42
43
|
try {
|
|
43
44
|
const membersQuery = await wixData
|
|
@@ -47,22 +48,22 @@ async function scheduleHideAllMemberAddresses() {
|
|
|
47
48
|
const members = await queryAllItems(membersQuery);
|
|
48
49
|
console.log(`Fetched ${members.length} members with addresses`);
|
|
49
50
|
|
|
50
|
-
// Only members that still have at
|
|
51
|
+
// Only members that still have an address not at the target status need updating.
|
|
51
52
|
const memberIds = [
|
|
52
53
|
...new Set(
|
|
53
54
|
members
|
|
54
|
-
.filter(
|
|
55
|
+
.filter(needsCityStateUpdate)
|
|
55
56
|
.map(member => Number(member.memberId))
|
|
56
57
|
.filter(memberId => Number.isFinite(memberId) && memberId > 0)
|
|
57
58
|
),
|
|
58
59
|
];
|
|
59
|
-
console.log(`Members
|
|
60
|
+
console.log(`Members needing a city/state update: ${memberIds.length}`);
|
|
60
61
|
|
|
61
62
|
if (memberIds.length === 0) {
|
|
62
|
-
console.log('No members need their addresses
|
|
63
|
+
console.log('No members need their addresses set to city/state');
|
|
63
64
|
return {
|
|
64
65
|
success: true,
|
|
65
|
-
message: 'No members need their addresses
|
|
66
|
+
message: 'No members need their addresses set to city/state',
|
|
66
67
|
totalMembers: 0,
|
|
67
68
|
tasksScheduled: 0,
|
|
68
69
|
};
|
|
@@ -72,7 +73,7 @@ async function scheduleHideAllMemberAddresses() {
|
|
|
72
73
|
for (let i = 0; i < chunks.length; i++) {
|
|
73
74
|
const chunk = chunks[i];
|
|
74
75
|
await taskManager().schedule({
|
|
75
|
-
name: TASKS_NAMES.
|
|
76
|
+
name: TASKS_NAMES.setAddressesToCityStateChunk,
|
|
76
77
|
data: {
|
|
77
78
|
memberIds: chunk,
|
|
78
79
|
chunkIndex: i,
|
|
@@ -93,22 +94,22 @@ async function scheduleHideAllMemberAddresses() {
|
|
|
93
94
|
console.log(JSON.stringify(result, null, 2));
|
|
94
95
|
return result;
|
|
95
96
|
} catch (error) {
|
|
96
|
-
console.error('Error scheduling
|
|
97
|
+
console.error('Error scheduling set-addresses-to-city-state:', error);
|
|
97
98
|
throw error;
|
|
98
99
|
}
|
|
99
100
|
}
|
|
100
101
|
|
|
101
102
|
/**
|
|
102
|
-
* Processes a chunk of members and sets every address to
|
|
103
|
+
* Processes a chunk of members and sets every address to STATE_CITY_ZIP.
|
|
103
104
|
* @param {Object} data
|
|
104
105
|
* @param {Array<number|string>} data.memberIds
|
|
105
106
|
* @param {number} data.chunkIndex
|
|
106
107
|
* @param {number} data.totalChunks
|
|
107
108
|
*/
|
|
108
|
-
async function
|
|
109
|
+
async function setAddressesToCityStateChunk(data) {
|
|
109
110
|
const { memberIds, chunkIndex, totalChunks } = data;
|
|
110
111
|
console.log(
|
|
111
|
-
`Processing
|
|
112
|
+
`Processing set-city-state chunk ${chunkIndex + 1}/${totalChunks} (${memberIds.length} members)`
|
|
112
113
|
);
|
|
113
114
|
|
|
114
115
|
const result = { successful: 0, failed: 0, skipped: 0, errors: [], failedIds: [] };
|
|
@@ -119,14 +120,14 @@ async function hideMemberAddressesChunk(data) {
|
|
|
119
120
|
|
|
120
121
|
const membersToUpdate = [];
|
|
121
122
|
members.forEach(member => {
|
|
122
|
-
// Skip members that have no address or are already
|
|
123
|
-
if (!
|
|
123
|
+
// Skip members that have no address or are already all at the target status.
|
|
124
|
+
if (!needsCityStateUpdate(member)) {
|
|
124
125
|
result.skipped++;
|
|
125
126
|
return;
|
|
126
127
|
}
|
|
127
128
|
membersToUpdate.push({
|
|
128
129
|
...member,
|
|
129
|
-
addresses:
|
|
130
|
+
addresses: setAddressesToCityState(member),
|
|
130
131
|
});
|
|
131
132
|
});
|
|
132
133
|
|
|
@@ -138,7 +139,7 @@ async function hideMemberAddressesChunk(data) {
|
|
|
138
139
|
try {
|
|
139
140
|
await bulkSaveMembers(membersToUpdate);
|
|
140
141
|
result.successful += membersToUpdate.length;
|
|
141
|
-
console.log(`✅
|
|
142
|
+
console.log(`✅ Set addresses to city/state for ${membersToUpdate.length} members`);
|
|
142
143
|
} catch (error) {
|
|
143
144
|
console.error('❌ Error bulk saving members:', error);
|
|
144
145
|
result.failed += membersToUpdate.length;
|
|
@@ -148,12 +149,12 @@ async function hideMemberAddressesChunk(data) {
|
|
|
148
149
|
|
|
149
150
|
return result;
|
|
150
151
|
} catch (error) {
|
|
151
|
-
console.error(`Error processing
|
|
152
|
+
console.error(`Error processing set-city-state chunk ${chunkIndex}:`, error);
|
|
152
153
|
throw error;
|
|
153
154
|
}
|
|
154
155
|
}
|
|
155
156
|
|
|
156
157
|
module.exports = {
|
|
157
|
-
|
|
158
|
-
|
|
158
|
+
scheduleSetAddressesToCityState,
|
|
159
|
+
setAddressesToCityStateChunk,
|
|
159
160
|
};
|
package/backend/tasks/consts.js
CHANGED
|
@@ -22,8 +22,8 @@ const TASKS_NAMES = {
|
|
|
22
22
|
fixPrimaryAddressChunk: 'fixPrimaryAddressChunk',
|
|
23
23
|
scheduleFixUrlsWithSpaces: 'scheduleFixUrlsWithSpaces',
|
|
24
24
|
fixUrlsWithSpacesChunk: 'fixUrlsWithSpacesChunk',
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
scheduleSetAddressesToCityState: 'scheduleSetAddressesToCityState',
|
|
26
|
+
setAddressesToCityStateChunk: 'setAddressesToCityStateChunk',
|
|
27
27
|
scheduleNormalizeMemberEmails: 'scheduleNormalizeMemberEmails',
|
|
28
28
|
normalizeMemberEmailsChunk: 'normalizeMemberEmailsChunk',
|
|
29
29
|
dailyPullExecutionCheck: 'dailyPullExecutionCheck',
|
|
@@ -8,16 +8,16 @@ const {
|
|
|
8
8
|
scheduleFixPrimaryAddressForMembers,
|
|
9
9
|
fixPrimaryAddressChunk,
|
|
10
10
|
} = require('./address-primary-methods');
|
|
11
|
+
const {
|
|
12
|
+
scheduleSetAddressesToCityState,
|
|
13
|
+
setAddressesToCityStateChunk,
|
|
14
|
+
} = require('./address-visibility-methods');
|
|
11
15
|
const { TASKS_NAMES } = require('./consts');
|
|
12
16
|
const { dailyPullExecutionCheck } = require('./daily-pull-check-methods');
|
|
13
17
|
const {
|
|
14
18
|
scheduleNormalizeMemberEmails,
|
|
15
19
|
normalizeMemberEmailsChunk,
|
|
16
20
|
} = require('./email-normalize-methods');
|
|
17
|
-
const {
|
|
18
|
-
scheduleHideAllMemberAddresses,
|
|
19
|
-
hideMemberAddressesChunk,
|
|
20
|
-
} = require('./hide-addresses-methods');
|
|
21
21
|
const {
|
|
22
22
|
scheduleTaskForEmptyAboutYouMembers,
|
|
23
23
|
convertAboutYouHtmlToRichContent,
|
|
@@ -211,17 +211,17 @@ const TASKS = {
|
|
|
211
211
|
shouldSkipCheck: () => false,
|
|
212
212
|
estimatedDurationSec: 80,
|
|
213
213
|
},
|
|
214
|
-
[TASKS_NAMES.
|
|
215
|
-
name: TASKS_NAMES.
|
|
214
|
+
[TASKS_NAMES.scheduleSetAddressesToCityState]: {
|
|
215
|
+
name: TASKS_NAMES.scheduleSetAddressesToCityState,
|
|
216
216
|
getIdentifier: () => 'SHOULD_NEVER_SKIP',
|
|
217
|
-
process:
|
|
217
|
+
process: scheduleSetAddressesToCityState,
|
|
218
218
|
shouldSkipCheck: () => false,
|
|
219
219
|
estimatedDurationSec: 80,
|
|
220
220
|
},
|
|
221
|
-
[TASKS_NAMES.
|
|
222
|
-
name: TASKS_NAMES.
|
|
221
|
+
[TASKS_NAMES.setAddressesToCityStateChunk]: {
|
|
222
|
+
name: TASKS_NAMES.setAddressesToCityStateChunk,
|
|
223
223
|
getIdentifier: task => task.data,
|
|
224
|
-
process:
|
|
224
|
+
process: setAddressesToCityStateChunk,
|
|
225
225
|
shouldSkipCheck: () => false,
|
|
226
226
|
estimatedDurationSec: 80,
|
|
227
227
|
},
|
package/package.json
CHANGED
package/pages/personalDetails.js
CHANGED
|
@@ -1077,7 +1077,10 @@ async function personalDetailsOnReady({
|
|
|
1077
1077
|
}
|
|
1078
1078
|
|
|
1079
1079
|
function renderServices() {
|
|
1080
|
-
|
|
1080
|
+
// Pass a fresh array copy so the Wix repeater detects the change and
|
|
1081
|
+
// re-renders. Assigning the same array reference (mutated in place by
|
|
1082
|
+
// add/delete) is treated as a no-op, leaving stale chips on screen.
|
|
1083
|
+
setupRepeater('#servicesRepeater', [...selectedServices]);
|
|
1081
1084
|
}
|
|
1082
1085
|
|
|
1083
1086
|
function setupRepeater(repeaterId, data) {
|