@optifye/dashboard-core 6.11.0 → 6.11.2

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.d.mts CHANGED
@@ -4630,7 +4630,7 @@ declare class UserManagementService {
4630
4630
  * @param roleFilter - Optional filter by role
4631
4631
  * @returns Promise<CompanyUserWithDetails[]>
4632
4632
  */
4633
- getCompanyUsers(companyId: string, roleFilter?: Exclude<AppRoleLevel, 'optifye'>): Promise<CompanyUserWithDetails[]>;
4633
+ getCompanyUsers(companyId: string, roleFilter?: string): Promise<CompanyUserWithDetails[]>;
4634
4634
  /**
4635
4635
  * Get ALL users across all companies (optifye role only)
4636
4636
  * This method bypasses company filtering and returns all users in the system
package/dist/index.d.ts CHANGED
@@ -4630,7 +4630,7 @@ declare class UserManagementService {
4630
4630
  * @param roleFilter - Optional filter by role
4631
4631
  * @returns Promise<CompanyUserWithDetails[]>
4632
4632
  */
4633
- getCompanyUsers(companyId: string, roleFilter?: Exclude<AppRoleLevel, 'optifye'>): Promise<CompanyUserWithDetails[]>;
4633
+ getCompanyUsers(companyId: string, roleFilter?: string): Promise<CompanyUserWithDetails[]>;
4634
4634
  /**
4635
4635
  * Get ALL users across all companies (optifye role only)
4636
4636
  * This method bypasses company filtering and returns all users in the system
package/dist/index.js CHANGED
@@ -69275,74 +69275,6 @@ var buildInitials = (name) => {
69275
69275
  const second = parts.length > 1 ? parts[1]?.[0] || "" : "";
69276
69276
  return `${first}${second}`.toUpperCase();
69277
69277
  };
69278
- var MOCK_IE_TEAM_USER_ID = "mock-industrial-engineering-team";
69279
- var MOCK_IE_TICKET_ID = "mock-ie-rack-too-far-away";
69280
- var getRandomVideoGalleryClips = (recommendations, maxClips = 3) => {
69281
- const seen = /* @__PURE__ */ new Set();
69282
- const candidates = [];
69283
- recommendations.forEach((rec) => {
69284
- if (!Array.isArray(rec.evidence)) return;
69285
- rec.evidence.forEach((evidenceItem) => {
69286
- if (evidenceItem.type !== "video_gallery" || !Array.isArray(evidenceItem.clips)) return;
69287
- evidenceItem.clips.forEach((rawClip) => {
69288
- if (!rawClip || typeof rawClip.clip_id !== "string") return;
69289
- const key = `${rawClip.clip_id}:${rawClip.workspace_id || ""}`;
69290
- if (seen.has(key)) return;
69291
- seen.add(key);
69292
- candidates.push({
69293
- clip_id: rawClip.clip_id,
69294
- workspace_id: typeof rawClip.workspace_id === "string" ? rawClip.workspace_id : void 0,
69295
- cycle_time_seconds: typeof rawClip.cycle_time_seconds === "number" ? rawClip.cycle_time_seconds : void 0,
69296
- cycle_sec: typeof rawClip.cycle_sec === "number" ? rawClip.cycle_sec : void 0
69297
- });
69298
- });
69299
- });
69300
- });
69301
- for (let i = candidates.length - 1; i > 0; i -= 1) {
69302
- const j = Math.floor(Math.random() * (i + 1));
69303
- [candidates[i], candidates[j]] = [candidates[j], candidates[i]];
69304
- }
69305
- return candidates.slice(0, Math.max(1, maxClips));
69306
- };
69307
- var buildIEMockRecommendation = (recommendations, lineNameById) => {
69308
- const now4 = /* @__PURE__ */ new Date();
69309
- const firstSeen = new Date(now4.getTime() - 3 * 24 * 60 * 60 * 1e3).toISOString();
69310
- const sampleRec = recommendations.find((rec) => !!rec.line_id) || recommendations[0];
69311
- const lineId = sampleRec?.line_id;
69312
- const line = lineId ? lineNameById.get(lineId) || sampleRec?.line || "Line 1" : sampleRec?.line || "Line 1";
69313
- const shiftLabel = sampleRec?.shift_label;
69314
- const shiftId = sampleRec?.shift_id;
69315
- const randomClips = getRandomVideoGalleryClips(recommendations, 3);
69316
- return {
69317
- id: MOCK_IE_TICKET_ID,
69318
- issue_id: MOCK_IE_TICKET_ID,
69319
- issue_number: 0,
69320
- issue_status: "open",
69321
- template_code: "ie_rack_too_far_away_mock",
69322
- type: "cycle_time",
69323
- title: "Rack too far away",
69324
- location: "Industrial Engineering Review",
69325
- line,
69326
- line_id: lineId,
69327
- description: "We analyzed 30 slow clips and saw that the top reason was the operator having to reach for the desk.",
69328
- resolution_instructions: "Completion condition: Move the rack 3 inches closer to the operator for better ergonomic posture.",
69329
- shift_id: shiftId,
69330
- shift_label: shiftLabel,
69331
- first_seen_at: firstSeen,
69332
- visible_since: firstSeen,
69333
- weeks_open: 1,
69334
- ticket_status: "active",
69335
- assigned_to_user_id: MOCK_IE_TEAM_USER_ID,
69336
- assigned_user_ids: [MOCK_IE_TEAM_USER_ID],
69337
- evidence: randomClips.length > 0 ? [
69338
- {
69339
- type: "video_gallery",
69340
- title: "Slow clips analyzed",
69341
- clips: randomClips
69342
- }
69343
- ] : []
69344
- };
69345
- };
69346
69278
  var ClipVideoCarousel = ({ clips, clipsService }) => {
69347
69279
  const [currentIndex, setCurrentIndex] = React141.useState(0);
69348
69280
  const [videos, setVideos] = React141.useState([]);
@@ -69801,21 +69733,6 @@ var ImprovementCenterView = () => {
69801
69733
  return map;
69802
69734
  }, [companyLines, configuredLines]);
69803
69735
  const companyId = user?.company_id || entityConfig.companyId;
69804
- const industrialEngineeringTeamMember = React141.useMemo(
69805
- () => ({
69806
- id: MOCK_IE_TEAM_USER_ID,
69807
- name: "Industrial Engineering Team",
69808
- role: "industrial_engineering",
69809
- initials: "IE"
69810
- }),
69811
- []
69812
- );
69813
- const teamMembersWithIETeam = React141.useMemo(() => {
69814
- if (teamMembers.some((member) => member.id === MOCK_IE_TEAM_USER_ID)) {
69815
- return teamMembers;
69816
- }
69817
- return [...teamMembers, industrialEngineeringTeamMember];
69818
- }, [teamMembers, industrialEngineeringTeamMember]);
69819
69736
  const clipsService = React141.useMemo(() => {
69820
69737
  try {
69821
69738
  return new S3ClipsSupabaseService(dashboardConfig);
@@ -69829,20 +69746,9 @@ var ImprovementCenterView = () => {
69829
69746
  if (!supabase || !companyId) return;
69830
69747
  try {
69831
69748
  const userService2 = createUserManagementService(supabase);
69832
- const roleFilters = ["supervisor", "owner", "industrial_engineer"];
69833
- const roleResults = await Promise.allSettled(
69834
- roleFilters.map((role) => userService2.getCompanyUsers(companyId, role))
69835
- );
69836
- roleResults.forEach((result, index) => {
69837
- if (result.status === "rejected") {
69838
- console.warn(
69839
- `[ImprovementCenterView] Failed to load ${roleFilters[index]} users`,
69840
- result.reason
69841
- );
69842
- }
69843
- });
69844
- const users = roleResults.flatMap(
69845
- (result) => result.status === "fulfilled" ? result.value : []
69749
+ const users = await userService2.getCompanyUsers(
69750
+ companyId,
69751
+ "supervisor,owner,industrial_engineer"
69846
69752
  );
69847
69753
  if (cancelled) return;
69848
69754
  const membersById = /* @__PURE__ */ new Map();
@@ -69928,11 +69834,7 @@ var ImprovementCenterView = () => {
69928
69834
  });
69929
69835
  const allowed = new Set(scopeLineIds);
69930
69836
  const scopedRecommendations = recs.filter((r2) => !r2.line_id || allowed.has(r2.line_id));
69931
- const mockRecommendation = buildIEMockRecommendation(scopedRecommendations, lineNameById);
69932
- setRecommendations([
69933
- mockRecommendation,
69934
- ...scopedRecommendations.filter((recommendation) => recommendation.id !== MOCK_IE_TICKET_ID)
69935
- ]);
69837
+ setRecommendations(scopedRecommendations);
69936
69838
  } catch (err) {
69937
69839
  if (cancelled) return;
69938
69840
  setLoadError(err?.message || "Failed to load recommendations");
@@ -69945,10 +69847,10 @@ var ImprovementCenterView = () => {
69945
69847
  return () => {
69946
69848
  cancelled = true;
69947
69849
  };
69948
- }, [supabase, companyId, scopeLineIdsKey, lineNameById]);
69850
+ }, [supabase, companyId, scopeLineIdsKey]);
69949
69851
  const teamMembersById = React141.useMemo(() => {
69950
- return new Map(teamMembersWithIETeam.map((member) => [member.id, member]));
69951
- }, [teamMembersWithIETeam]);
69852
+ return new Map(teamMembers.map((member) => [member.id, member]));
69853
+ }, [teamMembers]);
69952
69854
  const filteredRecommendations = React141.useMemo(() => {
69953
69855
  return recommendations.filter((rec) => {
69954
69856
  if (selectedLineId !== "all" && rec.line_id !== selectedLineId) return false;
@@ -70066,7 +69968,7 @@ var ImprovementCenterView = () => {
70066
69968
  setSelectedWeeksRange(weeksRange);
70067
69969
  };
70068
69970
  const handleMemberFilterChange = (memberId) => {
70069
- const memberName = memberId === "all" ? "all" : teamMembersWithIETeam.find((member) => member.id === memberId)?.name || memberId;
69971
+ const memberName = memberId === "all" ? "all" : teamMembers.find((member) => member.id === memberId)?.name || memberId;
70070
69972
  trackCoreEvent("Improvement Center Filter Applied", {
70071
69973
  filter_type: "member",
70072
69974
  filter_value: memberName,
@@ -70148,7 +70050,7 @@ var ImprovementCenterView = () => {
70148
70050
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: [
70149
70051
  { value: selectedShift, onChange: handleShiftFilterChange, options: shiftOptions, label: "Shift" },
70150
70052
  { value: selectedWeeksRange, onChange: handleWeeksFilterChange, options: weekOptions.map((o) => o.id), labels: weekOptions, label: "Duration" },
70151
- { value: selectedMemberId, onChange: handleMemberFilterChange, options: ["all", ...teamMembersWithIETeam.map((m) => m.id)], labels: teamMembersWithIETeam, label: "Member" },
70053
+ { value: selectedMemberId, onChange: handleMemberFilterChange, options: ["all", ...teamMembers.map((m) => m.id)], labels: teamMembers, label: "Member" },
70152
70054
  { value: selectedLineId, onChange: handleLineFilterChange, options: lineOptions.map((o) => o.id), labels: lineOptions, label: "Line" }
70153
70055
  ].map((filter2, idx) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
70154
70056
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-xs font-medium text-gray-500 uppercase tracking-wide ml-1", children: filter2.label }),
package/dist/index.mjs CHANGED
@@ -69246,74 +69246,6 @@ var buildInitials = (name) => {
69246
69246
  const second = parts.length > 1 ? parts[1]?.[0] || "" : "";
69247
69247
  return `${first}${second}`.toUpperCase();
69248
69248
  };
69249
- var MOCK_IE_TEAM_USER_ID = "mock-industrial-engineering-team";
69250
- var MOCK_IE_TICKET_ID = "mock-ie-rack-too-far-away";
69251
- var getRandomVideoGalleryClips = (recommendations, maxClips = 3) => {
69252
- const seen = /* @__PURE__ */ new Set();
69253
- const candidates = [];
69254
- recommendations.forEach((rec) => {
69255
- if (!Array.isArray(rec.evidence)) return;
69256
- rec.evidence.forEach((evidenceItem) => {
69257
- if (evidenceItem.type !== "video_gallery" || !Array.isArray(evidenceItem.clips)) return;
69258
- evidenceItem.clips.forEach((rawClip) => {
69259
- if (!rawClip || typeof rawClip.clip_id !== "string") return;
69260
- const key = `${rawClip.clip_id}:${rawClip.workspace_id || ""}`;
69261
- if (seen.has(key)) return;
69262
- seen.add(key);
69263
- candidates.push({
69264
- clip_id: rawClip.clip_id,
69265
- workspace_id: typeof rawClip.workspace_id === "string" ? rawClip.workspace_id : void 0,
69266
- cycle_time_seconds: typeof rawClip.cycle_time_seconds === "number" ? rawClip.cycle_time_seconds : void 0,
69267
- cycle_sec: typeof rawClip.cycle_sec === "number" ? rawClip.cycle_sec : void 0
69268
- });
69269
- });
69270
- });
69271
- });
69272
- for (let i = candidates.length - 1; i > 0; i -= 1) {
69273
- const j = Math.floor(Math.random() * (i + 1));
69274
- [candidates[i], candidates[j]] = [candidates[j], candidates[i]];
69275
- }
69276
- return candidates.slice(0, Math.max(1, maxClips));
69277
- };
69278
- var buildIEMockRecommendation = (recommendations, lineNameById) => {
69279
- const now4 = /* @__PURE__ */ new Date();
69280
- const firstSeen = new Date(now4.getTime() - 3 * 24 * 60 * 60 * 1e3).toISOString();
69281
- const sampleRec = recommendations.find((rec) => !!rec.line_id) || recommendations[0];
69282
- const lineId = sampleRec?.line_id;
69283
- const line = lineId ? lineNameById.get(lineId) || sampleRec?.line || "Line 1" : sampleRec?.line || "Line 1";
69284
- const shiftLabel = sampleRec?.shift_label;
69285
- const shiftId = sampleRec?.shift_id;
69286
- const randomClips = getRandomVideoGalleryClips(recommendations, 3);
69287
- return {
69288
- id: MOCK_IE_TICKET_ID,
69289
- issue_id: MOCK_IE_TICKET_ID,
69290
- issue_number: 0,
69291
- issue_status: "open",
69292
- template_code: "ie_rack_too_far_away_mock",
69293
- type: "cycle_time",
69294
- title: "Rack too far away",
69295
- location: "Industrial Engineering Review",
69296
- line,
69297
- line_id: lineId,
69298
- description: "We analyzed 30 slow clips and saw that the top reason was the operator having to reach for the desk.",
69299
- resolution_instructions: "Completion condition: Move the rack 3 inches closer to the operator for better ergonomic posture.",
69300
- shift_id: shiftId,
69301
- shift_label: shiftLabel,
69302
- first_seen_at: firstSeen,
69303
- visible_since: firstSeen,
69304
- weeks_open: 1,
69305
- ticket_status: "active",
69306
- assigned_to_user_id: MOCK_IE_TEAM_USER_ID,
69307
- assigned_user_ids: [MOCK_IE_TEAM_USER_ID],
69308
- evidence: randomClips.length > 0 ? [
69309
- {
69310
- type: "video_gallery",
69311
- title: "Slow clips analyzed",
69312
- clips: randomClips
69313
- }
69314
- ] : []
69315
- };
69316
- };
69317
69249
  var ClipVideoCarousel = ({ clips, clipsService }) => {
69318
69250
  const [currentIndex, setCurrentIndex] = useState(0);
69319
69251
  const [videos, setVideos] = useState([]);
@@ -69772,21 +69704,6 @@ var ImprovementCenterView = () => {
69772
69704
  return map;
69773
69705
  }, [companyLines, configuredLines]);
69774
69706
  const companyId = user?.company_id || entityConfig.companyId;
69775
- const industrialEngineeringTeamMember = useMemo(
69776
- () => ({
69777
- id: MOCK_IE_TEAM_USER_ID,
69778
- name: "Industrial Engineering Team",
69779
- role: "industrial_engineering",
69780
- initials: "IE"
69781
- }),
69782
- []
69783
- );
69784
- const teamMembersWithIETeam = useMemo(() => {
69785
- if (teamMembers.some((member) => member.id === MOCK_IE_TEAM_USER_ID)) {
69786
- return teamMembers;
69787
- }
69788
- return [...teamMembers, industrialEngineeringTeamMember];
69789
- }, [teamMembers, industrialEngineeringTeamMember]);
69790
69707
  const clipsService = useMemo(() => {
69791
69708
  try {
69792
69709
  return new S3ClipsSupabaseService(dashboardConfig);
@@ -69800,20 +69717,9 @@ var ImprovementCenterView = () => {
69800
69717
  if (!supabase || !companyId) return;
69801
69718
  try {
69802
69719
  const userService2 = createUserManagementService(supabase);
69803
- const roleFilters = ["supervisor", "owner", "industrial_engineer"];
69804
- const roleResults = await Promise.allSettled(
69805
- roleFilters.map((role) => userService2.getCompanyUsers(companyId, role))
69806
- );
69807
- roleResults.forEach((result, index) => {
69808
- if (result.status === "rejected") {
69809
- console.warn(
69810
- `[ImprovementCenterView] Failed to load ${roleFilters[index]} users`,
69811
- result.reason
69812
- );
69813
- }
69814
- });
69815
- const users = roleResults.flatMap(
69816
- (result) => result.status === "fulfilled" ? result.value : []
69720
+ const users = await userService2.getCompanyUsers(
69721
+ companyId,
69722
+ "supervisor,owner,industrial_engineer"
69817
69723
  );
69818
69724
  if (cancelled) return;
69819
69725
  const membersById = /* @__PURE__ */ new Map();
@@ -69899,11 +69805,7 @@ var ImprovementCenterView = () => {
69899
69805
  });
69900
69806
  const allowed = new Set(scopeLineIds);
69901
69807
  const scopedRecommendations = recs.filter((r2) => !r2.line_id || allowed.has(r2.line_id));
69902
- const mockRecommendation = buildIEMockRecommendation(scopedRecommendations, lineNameById);
69903
- setRecommendations([
69904
- mockRecommendation,
69905
- ...scopedRecommendations.filter((recommendation) => recommendation.id !== MOCK_IE_TICKET_ID)
69906
- ]);
69808
+ setRecommendations(scopedRecommendations);
69907
69809
  } catch (err) {
69908
69810
  if (cancelled) return;
69909
69811
  setLoadError(err?.message || "Failed to load recommendations");
@@ -69916,10 +69818,10 @@ var ImprovementCenterView = () => {
69916
69818
  return () => {
69917
69819
  cancelled = true;
69918
69820
  };
69919
- }, [supabase, companyId, scopeLineIdsKey, lineNameById]);
69821
+ }, [supabase, companyId, scopeLineIdsKey]);
69920
69822
  const teamMembersById = useMemo(() => {
69921
- return new Map(teamMembersWithIETeam.map((member) => [member.id, member]));
69922
- }, [teamMembersWithIETeam]);
69823
+ return new Map(teamMembers.map((member) => [member.id, member]));
69824
+ }, [teamMembers]);
69923
69825
  const filteredRecommendations = useMemo(() => {
69924
69826
  return recommendations.filter((rec) => {
69925
69827
  if (selectedLineId !== "all" && rec.line_id !== selectedLineId) return false;
@@ -70037,7 +69939,7 @@ var ImprovementCenterView = () => {
70037
69939
  setSelectedWeeksRange(weeksRange);
70038
69940
  };
70039
69941
  const handleMemberFilterChange = (memberId) => {
70040
- const memberName = memberId === "all" ? "all" : teamMembersWithIETeam.find((member) => member.id === memberId)?.name || memberId;
69942
+ const memberName = memberId === "all" ? "all" : teamMembers.find((member) => member.id === memberId)?.name || memberId;
70041
69943
  trackCoreEvent("Improvement Center Filter Applied", {
70042
69944
  filter_type: "member",
70043
69945
  filter_value: memberName,
@@ -70119,7 +70021,7 @@ var ImprovementCenterView = () => {
70119
70021
  /* @__PURE__ */ jsx("div", { className: "space-y-3", children: [
70120
70022
  { value: selectedShift, onChange: handleShiftFilterChange, options: shiftOptions, label: "Shift" },
70121
70023
  { value: selectedWeeksRange, onChange: handleWeeksFilterChange, options: weekOptions.map((o) => o.id), labels: weekOptions, label: "Duration" },
70122
- { value: selectedMemberId, onChange: handleMemberFilterChange, options: ["all", ...teamMembersWithIETeam.map((m) => m.id)], labels: teamMembersWithIETeam, label: "Member" },
70024
+ { value: selectedMemberId, onChange: handleMemberFilterChange, options: ["all", ...teamMembers.map((m) => m.id)], labels: teamMembers, label: "Member" },
70123
70025
  { value: selectedLineId, onChange: handleLineFilterChange, options: lineOptions.map((o) => o.id), labels: lineOptions, label: "Line" }
70124
70026
  ].map((filter2, idx) => /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
70125
70027
  /* @__PURE__ */ jsx("label", { className: "text-xs font-medium text-gray-500 uppercase tracking-wide ml-1", children: filter2.label }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optifye/dashboard-core",
3
- "version": "6.11.0",
3
+ "version": "6.11.2",
4
4
  "description": "Reusable UI & logic for Optifye dashboard",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",