EmailTemplatePreview modal 추가하기
행 액션 미리보기를 엽니다. TemplateApi.p (review);를 통해 백엔드 렌더링 style isolation의 sandboxed iframe에 표시된 결과. 일치하기 사용하는 정확한 코드 경로, 그래서 당신이 미리보기는 어떤 수신자가 얻을. SP2의 부분.
사용되지 않은 이메일 삭제GeneralManager.tsx (~560 행 죽은 코드)
성분은 결코 어디에서든지 수입되지 않았습니다. 그것의 toggles (부스 취급, unsubscribe, 배송 추적, 이메일에서 기본)는 백엔드가 없었다 순수 화장품 setTimeout 루즈. 그 특징의 각 배 해당 백엔드가 존재하면 자신의 spec을 통해. SP2의 부분.
TemplateApi + categoryApi + variableContracts 클라이언트 모듈 추가
SP1의 /api/email/templates/* 및 *********** Typed TypeScript 헬퍼와 엔드포인트. variableContracts 미러 SP1 TemplateKeys Javadoc 그래서 편집기의 변수 피커는 선언 REQUIRED 템플릿에 대한 계약. SP2...
Wire EmailTemplateSeedClient into ****************
Thin RestTemplate client that POSTs to EmailService's **************** after an org + owner TeamMember are persisted. Retries twice with backoff; failure throws...
Add EmailTemplateCategoryController REST endpoints
**************** CRUD. Delete response includes reassignedCount — the number of templates that became uncategorized as a result of removing the category. Sessio...
Add EmailTemplateController REST endpoints + DTOs
Exposes /api/email/templates/* CRUD + preview + duplicate + reset-to-default + service-to-service /send + /seed-org/{orgId}. Top-level orgs (no parent) addition...
Service-to-service endpoint에 대한 InternalAuthFilter 추가
/api/email/templates/send에 X-Internal-Auth 헤더를 유효성 검사합니다. /api/email/templates/seed-org/* 경로. 다른 경로 우회 이 필터 (사용자 세션 auth 그들을 처리). 비밀은 INTERNAL AUTH SECRET에서 온다 ...
EmailTemplateCategoryService 추가 — CRUD for org-scoped 카테고리
Case-insensitive name uniqueness per org 서비스 레이어에 강제 (DB의 일부 고유 인덱스를 매칭). 삭제 null 카테고리 id 범주를 제거하기 전에 영향을받는 템플릿에. SP1의 부분.
Add EmailTemplateService — CRUD + send + seed + reset-to-default
거래 이메일의 핵심 오케스트라. sendToUser는 템플릿을 해결합니다. 제목/체를 렌더링, 조직에서 org의 기본 도메인을 선택합니다. 도메인, noReply@{org.domain} 으로 이메일 보내기SmtpService 를 호출합니다. SeedForOrg for new-org Li...
Add NoReplySenderService for 'NoReply@{domain}' from-address
주소에서 거래 이메일에 대한 진실의 단일 소스. 지원하다 도메인 문자열, lowcase-normalizes, 반환 "NoReply@<domain>". Callers는 org의 도메인을 해결해야합니다 ( Organization.domains lookup 또는 유사) 그리고 그것을 안으로 ...
TemplateRenderer를 {{var}} 대용 추가하기
Stateless regex 기반 렌더링기. Missing vars 대체 빈 문자열 및 템플릿키 + orgId로 WARN 로그를 방출합니다. HTML escaping 없음 v1 - 값은 서버 제어입니다. SP1의 부분.
Append Z to dateCommitted so JS parses it as UTC
LocalDateTime.toString() produces no timezone designator, causing JavaScript's new Date() to treat the UTC value as local time and display timestamps 7-8 hours ...
Add EmailTemplateSeedRunner for SYSTEM + per-org seeding
Runs at @Order(20) on KamoInitializerService startup. Loads canonical templates from kamo-shared-library resources; upserts SYSTEM rows (no clobber); backfills ...
Convert PT midnight cutoff to UTC for today-count query
Commits are stored in UTC but the cutoff was a naive LocalDateTime in PT, causing yesterday-evening PT commits (00:00–06:59 UTC) to be counted as today.
Add partial unique indexes + CHECK constraints for email_templates
Hibernate ddl-auto can't generate partial unique indexes or computed-CHECK constraints. This commit adds them via the existing idempotent DDL runner pattern aft...
Bump kamo-shared-library 버전 1.2.0 SP1 추가
EmailTemplate, EmailTemplateCategory, TemplateStatus, TemplateKeys 추가 CanonicalTemplate, CanonicalTemplateLoader 및 canonical HTML 자원.
CanonicalTemplateLoader + CanonicalTemplate 기록을 추가하십시오
3개의 필요한 템플릿(WELCOME, PASSWORD RESET, EMAIL VERIFICATION) 클래스 경로 리소스에서 *************** 제출하기 KamoInitializer System-row 묘종 서비스. SP1의 부분.
WELCOME, PASSWORD RESET, EMAIL VERIFICATION에 대한 canonical HTML + JSON 추가
시스템 행에 대한 Source-of-truth 내용. KamoInitializerService에서 로드됨 CanonicalTemplateLoader 및 UPSERTed의 시작은 email templates로 발송됩니다. SP1의 부분.
MailboxId→id와 공급자Status→status를 우편함 명부 응답에 지명하십시오
Align 필드 이름 회원 mailbox 목록에 대한 기대.
EmailTemplate entity + 저장소 추가
Template key (org id NULL, is system TRUE)에 대한 하나의 시스템 행 저장 Template key 당 org 당 한 clone. 소프트 환경 org id/category id. 사이트맵 driven timestamps; body blocks 및 태그에 대...
EmailTemplateCategory entity + 저장소 추가
Org-scoped 카테고리 이메일 템플릿. 소프트 BIGINT org id (FK 없음) 기존 패턴 일치. Case-insensitive 이름 고유성 per-org는 KamoInitializerService에 추가된 부분 인덱스를 통해 시행됩니다. SP1의 부분.
TemplateStatus enum + TemplateKeys 거래 템플릿에 대한 상수
REQUIRED/CUSTOM/ARCHIVED 수명주기 상태를 선언하고 3 필요한 템플릿 키 (WELCOME, PASSWORD RESET, EMAIL VERIFICATION). 각 REQUIRED 템플릿에 대한 가변 계약은 Javadoc으로 문서화 일정 클래스; SP3 및 SP4 콜러 참...
Seed KamoCRM with ALL_WORK_ELIGIBLE on fresh installs
The createOrg() helper applies this single argument to both ageReqTypeMember and ageReqTypeTeamMember; consistent with platform convention. Pairs with KamoCRMAg...
Tighten KamoCRMAgeReqUpdateRunner per review
- Restore Javadoc paragraph explaining @Order(10) rationale. - Test now references the UPDATE_SQL constant directly instead of duplicating the SQL string, so ...
Add one-time runner to migrate KamoCRM agereq to ALL_WORK_ELIGIBLE
Conditional idempotent UPDATE runs on service startup; WHERE clause checks the expected old value so re-runs are no-ops. Errors are logged and swallowed — start...
모든 CSS-filter 로고 인스턴스를 흰색 SVG로 교체하십시오
Navigation, SubNavigation, Footer, SubFooter 및 Preloader 모두 사용 동일한 깨진 필터 밝기 - 0 invert 패턴. 대체로 보드를 가로 질러 로고 풀 화이트.svg.
CSS 필터 대신 footer에서 White SVG 로고 사용
Nav와 같은 수정 - backdrop-filter 내부 img에 CSS 필터는 iOS Safari에서 신뢰할 수 없습니다.
Guard Color-scheme with ! 테마 CSS 오버라이드에 대한 임포트
DynamicMetaLoader는 원격 CSS를 삽입할 수 있습니다. 더 보기 ! 임포트란트는 색상-scheme을 보장합니다. 어두운 테마 스타일 시트에 의해 overridden 할 수 없습니다.
TouchOptimized min-height Conductment에서 Footer 및 nav 링크를 제외하십시오
TouchOptimized는 모든 <a> 요소에 minHeight:44px를 설정했습니다. 44px, footer nav 링크 포함 (~20px 키). 이 ran 동안 hydration 에 각 <li> 플렉스 아이템 44px를 키우고 생산합니다. footer 링크 컬럼에 있는 두 배 짜...
CSS 필터 대신 pre-rendered white SVG 로고 사용
Backdrop-filter 내부 img에 CSS 필터는 iOS Safari에서 신뢰할 수 있습니다. #ffffff에 설정된 모든 채우기로 로고 전체 흰색.svg 생성 및로드 직접 - 필터 없음, 브라우저 quirks 없음, 모든 장치에서 보장 된 흰색.
Lock Tailwind 어두운 모드 변형을 클래스 기반, 절대 OS 미디어 쿼리
Tailwind v4는 어둠을 기본으로 합니다. @variant override는 .dark 클래스가 될 때만 활성화합니다. DOM에서 존재하는 — OS는 어떤 장치든지에 결코 플립할 수 없습니다.
신뢰할 수있는 흰색 렌더링을위한 로고 링크에 인라인 필터 스타일 사용
Img 요소의 Tailwind 필터 클래스는 모바일 브라우저에서 일관성이 있습니다. 앵커 요소의 인라인 스타일은 밝기를 보장합니다(0) invert(1)는 어디에나 적용됩니다.
Force dark color-scheme 그래서 브라우저는 조명 모드 렌더링을 적용하지 않습니다
'light only'에서 globals.css, generateViewport, 그리고 'dark'로 변경 html 요소 스타일 - 이것은 SVGs 및 Native UI를 렌더링하는 브라우저를 중지합니다. 어둠의 배경에 대한 검은 색을 나타나는 로고를 일으키는 조명 모드에서.
모바일에서 nav 행 뒤에 렌더링에서 로고를 방지
CSS 필터로 div wrapper는 새로운 stacking context를 생성했습니다. 모바일 브라우저의 header의 backdrop-filter로 로고를 페인트하는 데 헤더 배경 뒤에. 이미지 요소에 필터 클래스를 직접 적용하십시오.
JumpToBar 및 PreviewBanner에서 스크롤 바 및 모바일 클립을 해결
- overflowY를 추가하십시오: JumpToBar 내부 콘테이너에 숨겨지은 수직 scrollbar를 방지하기 위하여 - PreviewBanner 콘텐츠를 허용하여 모바일을 감싸기 때문에 텍스트는 초상화 폰에 클립되지 않습니다
Footer 링크 목록에 인라인 플렉스 갭을 가진 space-y-4를 대체하십시오
Tailwind space-y-4 용도 : CSS를 가진 인종(특성 0) 단단한 상쾌한 수직 간격을 일으키는 원인이 되는에 적재. 제품정보 스타일은 SSR HTML에 내장되어 즉시 적용 외부 CSS 짐 순서.
Set Traefik externalTrafficPolicy=Local to preserve client IP
With the default "Cluster" policy, kube-proxy SNATs external traffic to the node IP before forwarding to Traefik. That caused Traefik to see the node IP as the ...
누락된 requestIntegration i18n 키 추가
"사용자 정의 통합"의 밑에 "요청"버튼을 대체합니까? 사이트맵 /integrations는 원시 키로 돌아 왔습니다. *********** 키가 어디에서 정의되지 않았기 때문에. 모든 22 로컬에서 키를 추가 그리고 또한 stale customCtaSubheading 사본을 아직도 청소...
통합 로고 + 정확한 /integrations 메타데이터
통합 페이지와 허브는 지금 납품업자 로고를 표시합니다 (현재에 따라 다름) *********** 홈페이지의 자산 TechStackBanner는 이미 사용합니다). stale 마케팅 언어 제거 /integrations 자막, OG 이미지 및 메타데이터 설명. 변경 사항: 1. 통합 유...
모든 홈페이지에 /integrations 확장
Aligns the /integrations 페이지 와 실제 통합 노출 홈페이지 (TechStackBanner). 일치하는 28 새로운 통합 페이지 추가 제품이 실제로 제공하는 것: 음성 & 전화: - RingCentral (음성, 음성 분류) - FreePBX (곧, 요청 구동) ...
홈 Mortgage Brokers 산업 페이지 추가
/solutions/mortgage-brokers의 새로운 산업 솔루션 페이지 중개인 및 대출 발행자. 정직한 플랫폼 framing를 따르십시오: core CRM + comms + docs + AI는 차용기 및 추천 파트너에 적용 mortgage-specific 기능 (LOS 통합, 크...
정직 마케팅 - 실제 플랫폼 기능에 대한 정렬 페이지
실제 KamoCRM 제품 기능에 대한 마케팅 페이지의 전체 리뷰. 오늘 건축하지 않은 기능에 대한 제거 된 직물 청구, 및 재조합 산업별 및 통합별 제작 가능 새로운 기능 요청 시스템을 통해 기능. KamoCRM은 실제로 제공 (지금 정확하게 반영) : - customizable 파이...
92 SEO 페이지 추가 - 산업, 통합, 광택
SEO 콘텐츠 확장 계획의 Tier 1 구현 : 3 새로운 내용 총 92개의 새로운 크롤링 가능한 URL과 3개의 허브 페이지가 있습니다. 1. /solutions — 36개의 기업 방문 페이지 부동산, 대행사, 전문 서비스, 금융 서비스, 법률, 보험, 피트니스 스튜디오, 살롱 & ...
Add geo-database-url to analytics-secret for CockroachDB geolite lookup
Kamo Analytics uses this URL to look up visitor IP→country/region/city from the **************** tables. Uses kamo user with password auth and sslmode=require (...
